使用 maven 构建一个 fat jar

问题描述 投票:0回答:7

我有一个代码库,我想将其作为 jar 分发。它还依赖于外部 jar,我想将其捆绑在最终的 jar 中。

听说可以使用

maven-assembly-plug-in
来完成,但是我不明白怎么做。有人能给我举一些例子吗?

现在,我正在使用 fat jar 来捆绑最终的 jar。我想用 maven 达到同样的目的。

maven jar maven-assembly-plugin
7个回答
182
投票

注意:如果你是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>

66
投票

您可以使用maven-shade-plugin.

在构建中配置 shade 插件后,命令

mvn package
将创建一个 jar,并将所有依赖项合并到其中。


53
投票

也许你想要

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>

参考资料:


17
投票

实际上,添加

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

对 maven-jar-plugin 的声明不会为我将主类条目添加到清单文件中。 我必须将它添加到 maven-assembly-plugin 才能在清单中得到它


5
投票

可以使用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


2
投票

另一种方法是使用 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>

1
投票

如果你想使用 maven-assembly-plugin,请阅读。

正如其他答案已经概述的那样,maven-shade-plugin 似乎提供了更多功能,并且是构建胖罐子的推荐插件,但是如果您想使用 maven-assembly-plugin 以下插件配置将起作用。

@jmj 的回答解释说可以使用额外的 maven-jar-plugin 设置正确的类路径,但这只会将类路径添加到原始 jar 而不是 fat jar。该信息必须直接包含在 maven-assembly-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罐子将被创建,你可以用
java -jar yourJar.jar
运行你的fat罐子。

© www.soinside.com 2019 - 2024. All rights reserved.