使用maven构build一个胖jar子

我有一个代码库,我想分发为jar。 它也依赖于外部的jar子,我想在最后的jar子里捆绑。

我听说这可以使用maven-assembly-plug-in来完成,但是我不明白。 有人可以给我一些例子。

现在,我正在使用胖jar来捆绑最后的jar子。 我想用maven实现同样的function。

添加以下插件到您的pom.xml最新版本可以在https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-assembly-plugin

  ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>CHOOSE LATEST VERSION HERE</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>assemble-all</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> 

configuration好这个插件后,运行mvn package会产生两个jar:一个只包含项目类,另一个包含所有依赖后缀的“jar -with-dependencies”。

如果你想在运行时设置正确的classpath ,那么还要添加下面的插件

  <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>fully.qualified.MainClass</mainClass> </manifest> </archive> </configuration> </plugin> 

你可以使用maven-shade-plugin 。

在你的构build中configuration阴影插件后,命令mvn package将创build一个合并到其中的所有依赖的单个jar。

也许你想要maven-shade-plugin ,bundle依赖关系,最小化未使用的代码并隐藏外部依赖以避免冲突。

 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.3</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <minimizeJar>true</minimizeJar> <createDependencyReducedPom>true</createDependencyReducedPom> <dependencyReducedPomLocation> ${java.io.tmpdir}/dependency-reduced-pom.xml </dependencyReducedPomLocation> <relocations> <relocation> <pattern>com.acme.coyote</pattern> <shadedPattern>hidden.coyote</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin> </plugins> </build> 

参考文献:

您可以使用onejar-maven插件进行打包。 基本上,它把你的项目和它的依赖关系组装成一个jar包,不仅包括你的项目jar文件,还包括所有的外部依赖关系,例如“jarjar”

 <build> <plugins> <plugin> <groupId>com.jolira</groupId> <artifactId>onejar-maven-plugin</artifactId> <version>1.4.4</version> <executions> <execution> <goals> <goal>one-jar</goal> </goals> </execution> </executions> </plugin> </plugins> </build> 

注1:configuration选项在项目主页上可用。

注2:由于某种原因,onejar-maven-plugin项目不在Maven Central发布。 不过, jolira.com会跟踪原始项目并将其发布到groupId com.jolira

实际上,join了

 <archive> <manifest> <addClasspath>true</addClasspath> <packageName>com.some.pkg</packageName> <mainClass>com.MainClass</mainClass> </manifest> </archive> 

对maven-jar-plugin的声明不会将main类条目添加到清单文件中。 我不得不将它添加到maven-assembly-plugin中,以便在清单中获取它

另一种方法是使用maven 树荫插件来构build一个uber-jar

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version> Your Version Here </version> <configuration> <!-- put your configurations here --> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin>