我有一个代码库,我想将其作为 jar 分发。它还依赖于外部 jar,我想将其捆绑在最终的 jar 中。
我听说这可以使用
maven-assembly-plug-in
来完成,但我不明白如何做。有人可以给我举一些例子吗?
现在,我正在使用 fat jar 来捆绑最终的 jar。我想使用 Maven 实现同样的目标。
注意:如果你是spring-boot应用,请阅读答案末尾
将以下插件添加到您的
pom.xml
最新版本可以在找到
...
<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>
...
配置此插件后,运行
mvn package
将生成两个 jar:一个仅包含项目类,第二个 fat 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>
对于 Spring Boot 应用程序仅使用以下插件(选择适当的版本)
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<mainClass>${start-class}</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
也许您想要
maven-shade-plugin
,捆绑依赖项,最小化未使用的代码并隐藏外部依赖项以避免冲突。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</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>
参考资料:
实际上,添加
<archive>
<manifest>
<addClasspath>true</addClasspath>
<packageName>com.some.pkg</packageName>
<mainClass>com.MainClass</mainClass>
</manifest>
</archive>
对 maven-jar-plugin 的声明不会为我将主类条目添加到清单文件中。 我必须将其添加到 maven- assembly-plugin 才能将其添加到清单中
可以使用 onejar-maven-plugin 进行打包。基本上,它将您的项目及其依赖项组装为一个 jar,不仅包括您的项目 jar 文件,还包括所有外部依赖项作为“jar of jars”,例如
<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:配置选项可在项目主页找到。
注 2:由于某种原因,onejar-maven-plugin 项目未在 Maven Central 上发布。然而,jolira.com 跟踪原始项目并使用 groupId
com.jolira
将其发布到。
如果您想使用 maven-assemble-plugin,请阅读。
正如其他答案已经概述的那样,似乎 maven-shade-plugin 提供了更多功能,并且是构建 fat jar 的推荐插件,但如果您想使用 maven-assemble-plugin 以下插件配置将起作用。
@jmj 的答案解释说,可以使用附加的 maven-jar-plugin 设置正确的类路径,但这只会将类路径添加到原始 jar 而不是 fat jar。这些信息必须直接包含在 maven-assemble-plugin 的配置部分中。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.package.YourMainClass</mainClass>
</manifest>
</archive>
<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>
当您现在运行
maven package
时,将创建您的普通和 fat jar,您可以使用 java -jar yourJar.jar
运行您的 fat jar。
另一种方法是使用 maven shade 插件来构建
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>
为了避免 jar 文件名带有 jar-with-dependencies 后缀,请将appendAssemblyId 元素设置为 false。
<configuration>
<finalName>final-jar-name</finalName>
<appendAssemblyId>false</appendAssemblyId>
</configuration>