用maven建造一个胖罐子

时间:2013-04-25 19:04:35

标签: maven jar maven-assembly-plugin

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

我听说可以使用maven-assembly-plug-in完成此操作,但我不明白如何操作。有人能指点我一些例子。

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

6 个答案:

答案 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>