用maven建造一个胖罐子

bia*_*nca 109 jar maven maven-assembly-plugin

我有一个代码库,我想分发为jar.它还依赖于外部jar,我想在最后的jar中捆绑它.

我听说这可以用maven-assembly-plug-in,但我不明白怎么做.有人能指点我一些例子.

现在,我正在使用胖罐捆绑最后的罐子.我想用maven实现同样的目的.

Jig*_*shi 131

注意:如果您是一个spring-boot应用程序,请阅读答案的结尾

将以下插件添加到您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>
...
Run Code Online (Sandbox Code Playgroud)

配置此插件后,运行mvn package将生成两个jar:一个只包含项目类,另一个包含所有依赖项,后缀为"-jar-with-dependencies"的fat 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>
Run Code Online (Sandbox Code Playgroud)

对于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>
Run Code Online (Sandbox Code Playgroud)

  • 现在不推荐使用,而应该使用maven-shade-plugin.请参阅@phlogratos答案:http://stackoverflow.com/a/16222965/274350. (13认同)
  • @ user3833308"不赞成"可能是错误的词,但https://maven.apache.org/plugins/maven-assembly-plugin/上的文档说"如果你的项目想要将你的工件包装在超级罐中,程序集插件只提供基本支持.要获得更多控制,请使用Maven Shade插件." (3认同)
  • maven-assembly-plugin可以最小化胖罐的大小吗? (2认同)

phl*_*tos 54

你可以使用maven-shade-plugin.

在构建中配置shade插件后,该命令mvn package将创建一个包含所有依赖项的jar.

  • 现在这是正确的方法.maven-assembly-plugin文档指出:"如果你的项目想要在超级jar中打包你的工件,那么程序集插件只提供基本支持.为了更多控制,使用Maven Shade插件." (9认同)
  • @dutoitns 不,我无法给出具体的例子。但重写字节码是一件极其复杂的事情,并且容易出现更多错误。它还违背了用 Java 进行开发的部分目的,因为在开发中测试的字节码将与生产中运行的字节码不同。虽然构建中的大多数错误都会导致易于检测的编译或“文件未找到”错误,但这里构建实际上是在修改您编写的内容,任何错误都可能导致难以检测的奇怪行为。如果没有充分的理由,大多数企业级公司不会冒这个风险。 (3认同)
  • 我不同意这是现在“正确”的做法。如果您只想要基本行为,那么您绝对可以继续使用程序集插件。阴影插件可以执行高级操作,例如重写字节码以修改依赖项的包名称,一旦您开始使用生产代码进行操作,您就会引入额外的风险,如果您没有充分的理由,那么这是不值得的。 (2认同)

ggr*_*des 39

也许你想要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>
Run Code Online (Sandbox Code Playgroud)

参考文献:


use*_*330 10

实际上,添加

<archive>
   <manifest>
    <addClasspath>true</addClasspath>
    <packageName>com.some.pkg</packageName>                     
    <mainClass>com.MainClass</mainClass>
  </manifest>
</archive>
Run Code Online (Sandbox Code Playgroud)

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


mat*_*sev 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>
Run Code Online (Sandbox Code Playgroud)

注1:项目主页上提供了配置选项.

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


Max*_*Max 5

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

正如其他答案已经概述的那样, maven-shade-plugin似乎提供了更多功能,并且是构建 fat jar 的推荐插件,但如果您想使用 maven-assemble-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>
Run Code Online (Sandbox Code Playgroud)

当您现在运行时maven package,将创建您的普通 jar 和 fat jar,并且您可以使用 来运行 fat jar java -jar yourJar.jar