spring-boot:repackage 和 mvn package 的区别

Posted

技术标签:

【中文标题】spring-boot:repackage 和 mvn package 的区别【英文标题】:Difference between spring-boot:repackage and mvn package 【发布时间】:2017-08-12 18:53:27 【问题描述】:

在阅读了 Spring 文档和网络上的其他一些文章后,我仍然很困惑 Spring Boot Maven 插件的 spring-boot:repackage 和常规 mvn 包 有什么区别>.

我认为 mvn package 创建了一个包含所有依赖项的 jar,那么 Spring 使用该插件的真正原因是什么?

【问题讨论】:

I've thought that mvn package creates a jar with all dependencies included 在@Tome 的响应中添加:“..除非您的 POM 是 spring-boot-starter-parent 的子级”,在这种情况下,mvn package 将运行 spring-boot:repackage 目标,从而创建胖 JAR。 【参考方案1】:

Spring 重新打包在 Maven 生命周期的打包阶段构建的 jar 或 war。以下示例显示了目标目录中重新打包的 jar 和原始 jar:

$ mvn package
$ ls target/*.jar
target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original

如果你不包含配置,你可以自己运行插件(但前提是包目标也被使用)。例如:

$ mvn package spring-boot:repackage
$ ls target/*.jar
target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original

使用link查看spring网站的更多细节

【讨论】:

如果使用<packaging>jar</packaging>指令,可以生成可执行的自给自足jar:java -jar target/mymodule-0.0.1-SNAPSHOT.jar 对不起,我没有在这里得到区别......所以你在两种情况下都输出相同的输出?【参考方案2】:

mvn 包创建一个 jar 或 war。

spring boot 插件获取该 jar 或 war 并重新打包它们以使它们可以从命令行执行(即不需要应用服务器)。

来自插件文档:

“重新打包现有的 JAR 和 WAR 档案,以便可以使用 java -jar 从命令行执行它们。”

【讨论】:

好的,所以我认为这也是通过常规包完成的。我现在是否正确,您不能只是 java -jar 一个常规包?为了使其可执行,该常规包还应该做什么? spring-boot 插件究竟对那个常规包做了什么?如果我看起来很困惑,我很抱歉,我只是没有从他们的文档中理解它。【参考方案3】:

ma​​ven 包目标和 spring-boot:repackage 目标在本质上是不同的。 spring-boot 重新打包目标主要是使用java -jar *.jar 从命令行本身制作一个JAR 或WAR 可执行文件,而maven package 目标将编译后的代码打包成可分发的格式,例如JAR。它是spring-boot 重新打包目标,重新打包 maven 生成的 JAR 以指定主类并使用 嵌入式容器 使其可执行

Maven 包

通过同名的 POM 元素为项目设置打包的第一种也是最常用的方法。某些 有效的包装值为 jar、war、ear 和 pom。如果没有包装 值已指定,默认为jar。

当一个包被定义时,每个包都包含一个绑定到特定阶段的目标列表,jar包将绑定 以下目标来构建默认生命周期的各个阶段: 流程资源,编译,流程测试资源,测试编译,测试,打包,安装,部署。

Spring-boot:repackage

要包含的插件是:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.1.4.RELEASE</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

配置重新打包在 Maven 生命周期的打包阶段构建的 jar 或 war。

所以,一旦 spring-boot-maven-plugin 被包含在你的 pom.xml 中,它会自动尝试使用 spring-boot:repackage 目标重写档案以使其可执行。您应该使用常用的打包元素配置您的项目以构建 jar 或 war(视情况而定)。

参考:https://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html

【讨论】:

以上是关于spring-boot:repackage 和 mvn package 的区别的主要内容,如果未能解决你的问题,请参考以下文章

python累计求和,编写一个程序,从键盘输入两个整数m和n,求m和n之间(包括m和n)

m.2 nvme和m.2的区别是啥?

输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m 转载

显卡后面加h和m的区别

求满足从1加到m的和大于1000的最小m值

M和N 的运算