有没有办法强制maven(2.0.9)在一个jar文件中包含所有依赖项?
我将一个项目构建到一个jar文件中.我希望将依赖项中的类复制到jar中.
更新:我知道我不能在jar文件中包含一个jar文件.我正在寻找一种方法来解压缩指定为依赖项的jar,并将类文件打包到我的jar中.
您可以使用带有"jar-with-dependencies"描述符的maven-assembly插件来完成此操作.这是我们的一个pom.xml中的相关块,它执行此操作:
maven-assembly-plugin
package
single
jar-with-dependencies
使用Maven 2,正确的方法是使用Maven2 Assembly Plugin,它具有用于此目的的预定义描述符文件,您可以在命令行上使用:
mvn assembly:assembly -DdescriptorId=jar-with-dependencies
如果你想让这个jar可执行,只需添加要运行的主类到插件配置:
org.apache.maven.plugins maven-assembly-plugin my.package.to.my.MainClass
如果要将该程序集创建为正常构建过程的一部分,则应将单个或目录单个目标(assembly
目标应仅从命令行运行)绑定到生命周期阶段(package
有意义),如下所示:
org.apache.maven.plugins maven-assembly-plugin create-my-bundle package single ... jar-with-dependencies
调整configuration
元素以满足您的需求(例如,使用清单说明的东西).
如果你想做一个可执行的jar文件,他们也需要设置主类.所以完整的配置应该是.
maven-assembly-plugin package single fully.qualified.MainClass jar-with-dependencies
有阴影maven插件.它可用于打包和重命名依赖项(以省略类路径上的依赖性问题).
您可以使用
标记来使用新创建的jar .
your.group.id your.artifact.id 1.0 jar jar-with-dependencies
如果你(像我一样)不喜欢上面描述的jar-with-dependencies方法,我更喜欢的maven-solution是简单地构建一个WAR项目,即使它只是你正在构建的一个独立的java应用程序:
制作一个普通的maven jar项目,它将构建你的jar文件(没有依赖项).
另外,设置一个maven war-project(只有一个空的src/main/webapp/WEB-INF/web.xml文件,这将避免maven-build中的警告/错误),只有你的jar项目一个依赖项,并使你的jar项目成为
你的战争项目.(这个war-project只是将所有jar文件依赖项包装到zip文件中的简单技巧.)
构建war-project以生成war文件.
在部署步骤中,只需将.war文件重命名为*.zip并解压缩即可.
您现在应该有一个lib-directory(可以将它移动到您想要的位置)与您的jar以及运行应用程序所需的所有依赖项:
java -cp 'path/lib/*' MainClass
(classpath中的通配符适用于Java-6或更高版本)
我认为这在maven中设置更简单(不需要使用程序集插件)并且还可以让您更清楚地了解应用程序结构(您将在普通视图中看到所有相关jar的版本号,以及避免将所有内容堵塞到一个jar文件中).
http://fiji.sc/Uber-JAR提供了对替代方案的出色解释:
构建uber-JAR有三种常用方法:
无阴影.解压缩所有JAR文件,然后将它们重新打包到单个JAR中.
Pro:使用Java的默认类加载器.
Con:具有相同路径的多个JAR文件中存在的文件(例如,META-INF/services/javax.script.ScriptEngineFactory)将相互覆盖,从而导致错误行为.
工具:Maven Assembly Plugin,Classworlds Uberjar
阴影.与无阴影相同,但重命名(即"阴影")所有依赖项的所有包.
Pro:使用Java的默认类加载器.避免一些(不是全部)依赖版本冲突.
Con:具有相同路径的多个JAR文件中存在的文件(例如,META-INF/services/javax.script.ScriptEngineFactory)将相互覆盖,从而导致错误行为.
工具:Maven Shade插件
JAR的JAR.最终的JAR文件包含嵌入的其他JAR文件.
专业版:避免依赖版本冲突.保留所有资源文件.
Con:需要捆绑一个特殊的"bootstrap"类加载器,以使Java能够从包装的JAR文件中加载类.调试类加载器问题变得更加复杂.
工具:Eclipse JAR文件导出器,One-JAR.
org.apache.maven.plugins maven-dependency-plugin ${project.build.directory}/lib false false copy-dependencies package copy-dependencies org.apache.maven.plugins maven-jar-plugin 2.4 true lib/ maven-assembly-plugin package single jar-with-dependencies