问:
我想将我的项目打包在一个可执行的 JAR 中以进行分发。
如何使 Maven 项目将所有依赖项 JAR 打包到我的输出 JAR 中?
答1:
huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!
maven-assembly-plugin
fully.qualified.MainClass
jar-with-dependencies
你运行它
mvn clean compile assembly:single
编译目标应该在 assembly:single 之前添加,否则不包括您自己项目中的代码。
在评论中查看更多详细信息。
通常,此目标与自动执行的构建阶段相关联。这可确保在执行 mvn install 或执行部署/发布时构建 JAR。
maven-assembly-plugin
fully.qualified.MainClass
jar-with-dependencies
make-assembly
package
single
谢谢@IAdapter。请注意,您应该始终事先进行编译,因为它只会将“目标/类”中的任何内容放入 JAR 中。这将确保 JAR 包含您最近对源代码所做的任何更改。因此,您应该执行以下操作:mvn clean compile assembly:single。
我看到这不会将 jar 添加到 uber jar 中,而是将所有类文件添加到 jar 中。
提示:您还可以将元素 false 添加到 configuration 以避免名称中烦人的“-jar-with-dependencies”后缀
如果我没有 main 方法或类,我只需要一些随机的 java 文件作为 jar 怎么办?
@user10201743 只是提供一点上下文:Maven 中的 Everything 是一个插件。编译器? maven-compiler-plugin。测试? maven-surefire-plugin。这两个,包括程序集,是官方的 maven 插件,所以它们也可以被视为 maven 的一部分(尤其是因为,至少现在,它们三个都默认在你的有效 POM 中)。
答2:
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
您可以在打包阶段之前使用依赖插件在单独的目录中生成所有依赖项,然后将其包含在清单的类路径中:
org.apache.maven.plugins
maven-dependency-plugin
copy-dependencies
prepare-package
copy-dependencies
${project.build.directory}/lib
false
false
true
org.apache.maven.plugins
maven-jar-plugin
true
lib/
theMainClass
或者,使用 ${project.build.directory}/classes/lib 作为 OutputDirectory 将所有 jar 文件集成到主 jar 中,但是您需要添加自定义类加载代码来加载 jar。
有没有办法在不编写自定义类加载器的情况下使用此方法?我收到“ClassNotFoundException”。当我比较程序集插件时,我想我可以使用 maven-dependency-plugin 解包依赖项。有什么建议吗?
答3:
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求
请参阅 executable-jar-with-maven-example (GitHub)
笔记
Stephan 提供了这些优点和缺点。
对于手动部署
优点
缺点 依赖项不在最终的 jar 中。
依赖项不在最终的 jar 中。
将依赖项复制到特定目录
org.apache.maven.plugins
maven-dependency-plugin
copy-dependencies
prepare-package
copy-dependencies
${project.build.directory}/${project.build.finalName}.lib
使 Jar 可执行且可感知类路径
org.apache.maven.plugins
maven-jar-plugin
true
${project.build.finalName}.lib/
${fully.qualified.main.class}
此时,jar 实际上可以使用外部类路径元素执行。
$ java -jar target/${project.build.finalName}.jar
制作可部署的档案
jar 文件只能与同级 …lib/ 目录一起执行。我们需要制作档案以与目录及其内容一起部署。
org.apache.maven.plugins
maven-antrun-plugin
antrun-archive
package
run
现在您有了 target/${project.build.finalName}.(zip|tar|tar.bz2|tar.gz),每个都包含 jar 和 lib/*。
Apache Maven 程序集插件
优点
缺点 不支持类重定位(如果需要类重定位,请使用 maven-shade-plugin)。
没有类重定位支持(如果需要类重定位,请使用 maven-shade-plugin)。
org.apache.maven.plugins
maven-assembly-plugin
package
single
${fully.qualified.main.class}
jar-with-dependencies
您有 target/${project.bulid.finalName}-jar-with-dependencies.jar。
Apache Maven 阴影插件
优点
缺点
org.apache.maven.plugins
maven-shade-plugin
shade
true
${fully.qualified.main.class}
您有 target/${project.build.finalName}-shaded.jar。
onejar-maven-插件
优点
缺点 自 2012 年以来未得到积极支持。
自 2012 年以来未得到积极支持。
com.jolira
onejar-maven-plugin
${fully.qualified.main.class}
true
${project.build.finalName}-onejar.${project.packaging}
one-jar
Spring Boot Maven 插件
优点
缺点 添加潜在的不必要的 Spring 和 Spring Boot 相关类。
添加潜在的不必要的 Spring 和 Spring Boot 相关类。
org.springframework.boot
spring-boot-maven-plugin
repackage
spring-boot
${fully.qualified.main.class}
您有 target/${project.bulid.finalName}-spring-boot.jar。
答4:
huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感
接受未回答的答案并重新格式化,我们有:
org.apache.maven.plugins
maven-jar-plugin
true
fully.qualified.MainClass
maven-assembly-plugin
jar-with-dependencies
接下来,我建议将其作为构建的自然部分,而不是显式调用。要使其成为您构建的一个组成部分,请将此插件添加到您的 pom.xml 并将其绑定到 package 生命周期事件。但是,一个问题是,如果将它放在 pom.xml 中,则需要调用 assembly:single 目标,而如果从命令行手动执行,则需要调用“assembly:assembly”。
[...]
maven-assembly-plugin
true
fully.qualified.MainClass
jar-with-dependencies
make-my-jar-with-dependencies
package
single
[...]
[...]
答5:
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com
使用 maven-shade-plugin 将所有依赖项打包到一个 uber-jar 中。也可以通过指定主类来构建可执行jar。在尝试使用 maven-assembly 和 maven-jar 之后,我发现这个插件最适合我的需要。
我发现这个插件特别有用,因为它合并了特定文件的内容而不是覆盖它们。当 jar 中存在同名的资源文件并且插件尝试打包所有资源文件时,需要这样做
请参阅下面的示例
org.apache.maven.plugins
maven-shade-plugin
1.4
package
shade
bouncycastle:bcprov-jdk15
com.main.MyMainClass
properties.properties
applicationContext.xml
META-INF/cxf/cxf.extension
META-INF/cxf/bus-extensions.xml
答6:
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
您可以使用 maven-shade 插件来构建一个 uber jar,如下所示
org.apache.maven.plugins
maven-shade-plugin
package
shade
答7:
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
长期使用 maven 程序集插件,但我找不到解决 “already added, skipping” 问题的方法。现在,我正在使用另一个插件 - onejar-maven-plugin。下面的示例(mvn package 构建 jar):
org.dstovall
onejar-maven-plugin
1.3.0
com.company.MainClass
one-jar
您需要为该插件添加存储库:
onejar-maven-plugin.googlecode.com
http://onejar-maven-plugin.googlecode.com/svn/mavenrepo
答8:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
您可以使用 maven-dependency-plugin,但问题是如何创建可执行 JAR。为此,需要对 Matthew Franglen 的响应进行以下更改(顺便说一句,从干净的目标开始时使用依赖插件需要更长的时间来构建):
maven-jar-plugin
fully.qualified.MainClass
maven-dependency-plugin
unpack-dependencies
package
unpack-dependencies
${basedir}/target/dependency
答9:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
您可以将以下内容添加到您的 pom.xml:
install
maven-compiler-plugin
2.3.2
1.6
1.6
org.apache.maven.plugins
maven-jar-plugin
2.3.1
true
com.mycompany.package.MainClass
maven-assembly-plugin
jar-with-dependencies
com.mycompany.package.MainClass
make-my-jar-with-dependencies
package
single
之后,您必须通过控制台切换到 pom.xml 所在的目录。然后你必须执行 mvn assembly:single 然后你的可执行 JAR 文件与依赖项将有望被构建。您可以在使用 cd ./target 切换到输出(目标)目录并使用类似于 java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar 的命令启动 jar 时检查它。
我用 Apache Maven 3.0.3 对此进行了测试。
答10:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
如果您真的想将其他 JAR 内容重新打包到您的单个结果 JAR 中,另一个选项是 Maven Assembly plugin。它解压缩然后通过 true 将所有内容重新打包到一个目录中。然后你会有第二遍将它构建到一个巨大的 JAR 中。
Another option is the OneJar plugin。这一步完成了上述重新打包操作。
答11:
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
我浏览了这些响应中的每一个,希望制作一个包含所有依赖项的胖可执行 jar,但它们都不能正常工作。答案是阴影插件,它非常简单明了。
org.apache.maven.plugins
maven-shade-plugin
2.3
package
shade
path.to.MainClass
请注意,您的依赖项需要具有编译或运行时范围才能正常工作。
This example came from mkyong.com
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com