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