多项目maven项目的单个可执行jar

多项目maven项目的单个可执行jar,maven,dependencies,executable-jar,Maven,Dependencies,Executable Jar,我试图从一个多项目maven项目中创建一个可执行的jar。下面是我的项目结构,接下来是我尝试使用maven assembly插件所做的工作。如果有人能向我暗示解决方案,我将不胜感激(这在我看来是最常见的,但我在其他讨论链中找不到)。谢谢 我的结构是(简化的): myApp … 我的应用我的应用 0.0.1-快照pom myApphttp://maven.apache.org … org.apache.maven.plugins maven编译器插件 1.6 1.6 ../m1 ../m2

我试图从一个多项目maven项目中创建一个可执行的jar。下面是我的项目结构,接下来是我尝试使用maven assembly插件所做的工作。如果有人能向我暗示解决方案,我将不胜感激(这在我看来是最常见的,但我在其他讨论链中找不到)。谢谢

我的结构是(简化的):

myApp

…
我的应用我的应用
0.0.1-快照pom
myApphttp://maven.apache.org
…  
org.apache.maven.plugins
maven编译器插件
1.6  1.6
../m1
../m2
../subAppPomAggregationProject
…
我尝试将以下插件添加到myApp pom文件:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.4</version>
 <configuration>
   <appendAssemblyId>false</appendAssemblyId>
      <archive>
         <manifest>
            <mainClass>com.mypath.Main</mainClass>
         </manifest>
      </archive>
      <descriptorRefs>
    <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
 </configuration>
 <executions>
    <execution>
       <id>make-assembly</id>
       <phase>package</phase>
       <goals>
           <goal>single</goal>
       </goals>
    </execution>
 </executions>
</plugin>

maven汇编插件
2.4
假的
com.mypath.Main
带有依赖项的jar
组装
包裹
单一的
当然,它并没有为MyApp创建一个jar,但它确实在每个模块中创建了一个似乎是聚合的jar(!),尽管并不是所有的依赖关系都是如此

我还尝试创建另一个带有MyApp模块或依赖项的uber项目(jar)——但也没有成功。我是否应该在uber jar中列出导入MyApp的所有模块(以及导入subAppPomAggregationProject的模块)?没有尝试过,但如果是这样,pom聚合器的目的是什么,为什么要使用两阶段编译/聚合方法


我无法尝试maven shade插件(不确定是否有用),因为它需要maven 3,而我目前使用的是2.2.1(不想在我即将达到的里程碑之前升级和改动…。

如果shade插件可用,可以使用旧版本。
版本1.7.1是在Maven 2.x上运行的shade的最新版本,它将用于创建可执行的jar文件。。。语法应该基本相同,主要版本号的切换是为了表明需要切换到Maven 3。

在这种环境中工作的解决方案方法是分层聚合。因此,首先通过以下方式为subAppPomAggregationProject创建一个jar 创建say subAppPomAggregationProject.aggregate maven项目,并在其pom中将所有subAppPomAggregationProject模块指定为依赖项, 并添加maven assembly插件:

<build>
   <plugins>
      <plugin>
         <artifactId>maven-assembly-plugin</artifactId>
         <version>2.4</version>
         <configuration>
             <appendAssemblyId>false</appendAssemblyId>
             <descriptors>
                <descriptor>src/assembly/bin.xml</descriptor>
             </descriptors>
             <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
             </descriptorRefs>
         </configuration>
         <executions>
           <execution>
              <id>make-assembly</id>
              <phase>package</phase>
              <goals>
                 <goal>single</goal>
              </goals>
           </execution>
         </executions>
      </plugin>
    </plugins>
</build>]

maven汇编插件
2.4
假的
src/assembly/bin.xml
带有依赖项的jar
组装
包裹
单一的
]
然后在应用程序级别执行同样的操作-其中创建的subAppPomAggregationProject聚合jar是模块之一

因为在每个级别上,依赖项之间的冲突都得到了解决,所以在下一级聚合中,没有任何依赖项会引起冲突
(因为它们在单个jar中已经相对出现了……或者类似于这些行:-)。

我是在MyApp pom.xml(pom packaging)中添加这个插件,还是创建另一个项目(比如myappjar)来放置插件?如果是后者,我是否只需在myappjar pom.xml中放一个MyApp依赖项?每个模块一个工件。因此,不要劫持你的聚合器(同时父对象必须在子对象之前构建,因此即使你愿意也不能这样做),当我将shade插件添加到MyApp pom.xml时,我遇到以下错误:[INFO]将原始工件替换为shade工件。[INFO]将null替换为/home/../MyApp/target/MyApp-0.0.1-SNAPSHOT-shaded.pom[ERROR]生成错误[INFO]创建着色jar时出错:null。所以很明显,这个解决方案不起作用。将尝试第二个选项。当我将shade插件添加到MyApp pom.xml时,出现以下错误:[INFO]将原始工件替换为shade工件。[INFO]将null替换为/home/../MyApp/target/MyApp-0.0.1-SNAPSHOT-shaded.pom[ERROR]生成错误[INFO]创建着色jar时出错:null。所以很明显,这个解决方案不起作用。将尝试第二个选项。Stephen,我不确定我是否遵循了你在评论中的意思“每个模块一个工件……不要劫持你的聚合器”——你不是说为每个模块的pom.xml添加这个插件,对吗?将尝试向MyApp添加具有依赖关系的“uber项目”。
<build>
   <plugins>
      <plugin>
         <artifactId>maven-assembly-plugin</artifactId>
         <version>2.4</version>
         <configuration>
             <appendAssemblyId>false</appendAssemblyId>
             <descriptors>
                <descriptor>src/assembly/bin.xml</descriptor>
             </descriptors>
             <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
             </descriptorRefs>
         </configuration>
         <executions>
           <execution>
              <id>make-assembly</id>
              <phase>package</phase>
              <goals>
                 <goal>single</goal>
              </goals>
           </execution>
         </executions>
      </plugin>
    </plugins>
</build>]