我有一个代码库,我想将其分发为jar。它还依赖于外部jar,我想在最后的jar中捆绑它。
我听说可以使用maven-assembly-plug-in
完成此操作,但我不明白如何操作。有人能指点我一些例子。
现在,我正在使用胖罐捆绑最后的罐子。我想用maven实现同样的目标。
答案 0 :(得分:122)
注意:如果您是一个弹簧启动应用程序,请阅读答案结尾
将以下插件添加到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>
配置此插件后,运行mvn package
将生成两个jar:一个只包含项目类,另一个包含所有依赖项,后缀为“-jar-with-dependencies”的胖jar。
如果你想在运行时正确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>
对于春季启动应用程序,请使用以下插件(选择合适的版本)
<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>
答案 1 :(得分:50)
您可以使用maven-shade-plugin。
在构建中配置shade插件后,命令mvn package
将创建一个包含所有依赖项的jar。
答案 2 :(得分:31)
也许您需要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>
参考文献:
答案 3 :(得分:9)
实际上,添加了
<archive>
<manifest>
<addClasspath>true</addClasspath>
<packageName>com.some.pkg</packageName>
<mainClass>com.MainClass</mainClass>
</manifest>
</archive>
maven-jar-plugin的声明不会为清单文件添加主类条目。 我必须将它添加到maven-assembly-plugin才能在清单
中获取它答案 4 :(得分:5)
您可以使用onejar-maven-plugin进行打包。基本上,它将您的项目及其依赖项组装为一个jar,不仅包括您的项目jar文件,还包括所有外部依赖项作为“罐子罐”,例如
<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:项目home page提供配置选项。
注2:由于某种原因,onejar-maven-plugin项目未在Maven Central发布。但是jolira.com跟踪原始项目并将其发布到groupId com.jolira
。
答案 5 :(得分:1)
另一种方法是使用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>