Java Maven:程序集插件根本没有运行
我对Maven还很陌生,之前试过几次学习,觉得没有Maven我会更好。现在,(联合国)幸运的是,我不得不在一个我想参与的项目中使用Maven。我现在的问题是关于包装。我想制作一个包含所有依赖项的自包含(也称为“fat”)jar,一位与Maven打过交道的同事帮助我处理pom文件 我已经检查了他的pom文件,以及这里的样本等等。xml看起来合法,但插件根本没有运行。请注意,我没有得到任何错误,一切都很好,除了我没有得到“fatjar”。你知道这个问题的原因是什么吗 下面是pom.xml的相关部分。我看到过关于Java Maven:程序集插件根本没有运行,java,maven,packaging,Java,Maven,Packaging,我对Maven还很陌生,之前试过几次学习,觉得没有Maven我会更好。现在,(联合国)幸运的是,我不得不在一个我想参与的项目中使用Maven。我现在的问题是关于包装。我想制作一个包含所有依赖项的自包含(也称为“fat”)jar,一位与Maven打过交道的同事帮助我处理pom文件 我已经检查了他的pom文件,以及这里的样本等等。xml看起来合法,但插件根本没有运行。请注意,我没有得到任何错误,一切都很好,除了我没有得到“fatjar”。你知道这个问题的原因是什么吗 下面是pom.xml的相关部分。
和
标记定位的矛盾代码示例,尝试了我发现的几乎所有变体,仍然没有乐趣
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<id>make-jar-with-dependencies</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>ProjectName</finalName>
<appendAssemblyId>true</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>org.mydomain.ProjectName</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
我建议使用创建一个uberjar,因为它的意图正是这个目的。您也可以使用maven assembly插件来实现这一点 因此,在查看了您的pom后,我了解了问题所在。首先,您在pluginManagement块中定义了maven assembly插件,它将不执行插件,此外,您还将maven assembly插件单独定义为一个依赖项,这是多余的。这意味着只需从pom中删除以下内容:
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
<type>maven-plugin</type>
</dependency>
org.apache.maven.plugins
此外,你应该考虑其他人将在代理后使用项目等,而不是他必须更改你的pom以使我工作,或者不能使用它,因为你在你的pom中定义了存储库,他无法访问 依赖项看起来像
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>attached</goal>
</goals>
</execution>
</executions>
</plugin>
org.apache.maven.plugins
maven汇编插件
src/main/assembly/assembly.xml
包裹
附属的
您还需要定义assembly.xml,下面是一个示例
<assembly>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/lib</outputDirectory>
</dependencySet>
</dependencySets>
<fileSets>
<!-- move all the .jar from target to /lib -->
<fileSet>
<directory>target</directory>
<outputDirectory>/lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
<!-- include *.jar places the same version of >App.jar
twice in the lib, we need remove one -->
<excludes>
<exclude>App*.jar</exclude>
</excludes>
</fileSet>
<!-- move .bat from scripts to /scripts -->
<fileSet>
<directory>src/main/assembly/scripts</directory>
<outputDirectory>/bin</outputDirectory>
<includes>
<include>*.bat</include>
</includes>
</fileSet>
</fileSets>
</assembly>
拉链
假的
/解放党
目标
/解放党
*jar先生
App*.jar
src/main/assembly/scripts
/垃圾箱
*蝙蝠先生
也许你可以使用shade插件(这就是我使用的插件)
注意,依赖项包含在最终的JAR中。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>standalone-${artifactId}</finalName>
<archive>
<manifest>
<mainClass>com.mypckg.Launcher</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
org.apache.maven.plugins
maven阴影插件
包裹
阴凉处
独立-${artifactId}
com.mypckg.Launcher
关于我想就我的一个错误提供一个建议:我的xml如下所示:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
...all your configuration here..
</plugin>
</plugins>
</build>
<plugins>
<plugin>
<groupId>org.maven...</groupId>
<artifactId>myArtifact</artifact>
<configuration>
<descriptorRefs>....</descriptorRefs>
...
<executions>
<execution>
<phase>package</phase>
....
</execution>
</executions>
</configuration>
</plugin>
</plugins>
org.maven。。。
我的神器
....
...
包裹
....
而
块应该是
块的兄弟,而不是子块。我一修复这个问题,我的插件就开始在我的构建中再次执行。我对这个问题有另一种看法,这帮助我解决了%subc%。如果您阅读了关于如何制作可执行jar和带有依赖项的jar的文章,他们通常会提供代码片段,新手会尝试将这些代码片段复制到pom.xml中。那些不太了解pom.xml文件(又名me)的实际结构的人,这是一项相当困难的任务。我以这个(不起作用的)解决方案结束:
<project>
......
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.2.0</version>
<configuration>
............
</configuration>
<executions>
..............
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
......
是的,你不会犯同样的错误。但对我来说,这是一个巨大的未知,如果你从未使用过父项目,请确保你不会落入同样的陷阱。经过一些调整,这里是一个正在运行的maven汇编插件设置(在pom.xml中有正确的上下文)
4.0.0
等等
一些人工制品
1.0-快照
...
maven汇编插件
3.2.0
假的
真的
com.blah.blah.YourMainClass
带有依赖项的jar
组装
包裹
单一的
您如何称呼该项目?我不完全确定您的意思,但如果我理解正确,您会问我如何运行该项目?我通过终端和eclipse内部进行了尝试。没有区别…只要检查一下您是否只是从控制台执行mvn清理包。您是否可以在控制台上发布执行期间的输出?您是否在pluginManagement块中定义了程序集插件?你能发布完整的pom(可能在粘贴箱上)吗?或者你有多模块构建吗?这里是POM文件的大部分。注意,我删除了一些关于原始作者隐私的java依赖项,我非常确定它们与手头的问题无关,所以这应该不是什么大问题。所提到的插件之间有什么区别吗?顺便说一句,汇编插件也应该可以工作,就像你提到的,因此我不确定切换到其他插件是否是这里的神奇解决方案。[回复:编辑]将插件作为依赖项是解决问题的一次绝望的尝试,我可以证明它在
<project>
......
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.2.0</version>
<configuration>
............
</configuration>
<executions>
..............
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.blah.blah</groupId>
<artifactId>some-artifact</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
...
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId> <!-- nicer looking jar name -->
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.blah.blah.YourMainClass</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>
</plugins>
</build>
</project>