是否有可能创build一个包含项目类和项目依赖关系的“超级”jar作为与自定义清单文件的jar子?
我正在尝试创build一个包含项目类的可执行jar(它使用maven),并且它是一个清单文件的依赖关系,这个清单文件包含主类的条目以及指向打包在jar根目录下的依赖关系的类path条目;像这样的东西:
清单文件:
..... 主要类:com.acme.MainClass 类path:dependecy1.jar dependecy2.jar .....
jar:
jar子根 | - .... | - com / acme /../*。class | --dededecy1.jar `--dededecy2.jar
我使用maven-jar-plugin来创build清单文件和Maven-shade-plugin来创build“超级”jar,但是依赖被解压并添加为类到我的jar。
实际上,我并没有检查maven-shade-plugin
究竟做了什么(或者其他的插件),因为maven 2已经内build了一个megajar或者uberjar。 您只需使用带有预定义的jar-with-dependencies
描述符的maven-assembly-plugin。
只需将此片段添加到您的pom.xml
即可自定义清单:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>my.package.to.my.MainClass</mainClass> </manifest> </archive> </configuration> </plugin>
下面的命令会生成你的uberjar:
mvn assembly:assembly -DdescriptorId=jar-with-dependencies
但是,这个描述符的默认行为是解压依赖(如maven-shade-plugin)。 说实话,我不明白为什么这是一个问题,但如果这真的不是你想要的,你可以使用自己的自定义组装描述符。
为此,首先使用以下内容创build组装描述符,比如说src/assembly/uberjar.xml
:
<assembly> <id>uberjar</id> <formats> <format>jar</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <dependencySets> <dependencySet> <unpack>false</unpack> <scope>runtime</scope> <useProjectArtifact>false</useProjectArtifact> </dependencySet> </dependencySets> <fileSets> <fileSet> <directory>${project.build.outputDirectory}</directory> <outputDirectory>/</outputDirectory> </fileSet> </fileSets> </assembly>
然后,将maven-assembly-pluginconfiguration为使用此描述符,并将依赖关系添加到清单的Class-Path
条目中:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptors> <descriptor>src/assembly/uberjar.xml</descriptor> </descriptors> <archive> <manifest> <mainClass>my.package.to.my.MainClass</mainClass> <addClasspath>true</addClasspath> </manifest> </archive> </configuration> <!-- <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> --> </plugin>
最后运行mvn assembly:assembly
来生成你的uberjar。
(可选)取消注释executions
元素以在程序package
阶段上绑定程序集插件(并将程序集生成为常规构build的一部分)。
OneJar有一个maven2插件 。
过去我已经使用了FatJar。 http://fjep.sourceforge.net/
我创build了一个相对简单的应用程序,客户端将要双击一个可执行文件,并使其正常工作。 安装程序或依赖关系是不可能的。 Fatjar将Eclipse中的项目库和引用文件捆绑到几兆字节的可执行jar文件中。 无瑕。
我知道这样做的两个产品:
- 一个被称为“bigjar”,但这是一个过于笼统的术语,在谷歌search有用; 我无法find它。
- 另一个叫做“onejar”。 有相当多的参考资料,它声称做你所需要的。
以下是在Maven程序集中使用OneJar的人的一篇文章: