使用maven构建一个fat jar

qnakjoqk  于 2023-01-04  发布在  Maven
关注(0)|答案(7)|浏览(158)

我有一个代码库,我想以jar的形式分发,它也依赖于外部jar,我想把它捆绑在最终的jar中。
我听说这可以用maven-assembly-plug-in来实现,但是我不明白怎么做。有人能给我举一些例子吗?
现在,我正在使用fat jar打包最终的jar,我想使用maven实现同样的功能。

klsxnrf1

klsxnrf11#

注意:如果您是一个Spring启动应用程序,请阅读答案的结尾部分

添加以下插件到您的pom.xml最新版本可以是found at

...
<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”。
如果您希望在运行时正确设置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>
icnyk63a

icnyk63a2#

您可以使用maven-shade-plugin
在构建中配置shade插件后,命令mvn package将创建一个jar,所有依赖项都合并到其中。

tmb3ates

tmb3ates3#

也许您需要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>

参考文献:

dm7nw8vv

dm7nw8vv4#

实际上,添加

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

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

u0sqgete

u0sqgete5#

您可以使用X1 E0 F1 X进行打包。基本上,它将您的项目及其依赖项组装为一个jar,不仅包括您的项目jar文件,还包括所有外部依赖项作为“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的。

1hdlvixo

1hdlvixo6#

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

y53ybaqx7#

如果要使用maven-assembly-plugin,请阅读。
正如其他人已经给出的答案,maven-shade-plugin似乎提供了更多的特性,是构建一个fat jar的推荐插件,但是如果你想使用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时,将创建您的normal和fat jar,您可以使用java -jar yourJar.jar运行您的fat jar。

相关问题