是否有可能创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的人的一篇文章:

http://5341.com/list/55/498657.html