SpringBoot的repackage和Maven打包命令之间的区别 - Baeldung


Apache Maven是一种广泛使用的项目依赖项管理工具和项目构建工具。
在过去的几年中,Spring Boot已经成为构建应用程序的非常流行的框架。还有一个Spring Boot Maven插件在Apache Maven中提供Spring Boot支持。
我们知道,当我们想使用Maven将应用程序打包在JAR或WAR中时,可以使用mvn package。但是,Spring Boot Maven插件附带了一个 重新打包repackage,它也在mvn命令中被调用。有时,这两个mvn命令令人困惑。
 
mvn package命令将采用编译后的代码并将其打包为可分发格式,如JAR格式文件,它仅包含来自项目源的资源和已编译的Java类。
我们可以将此JAR文件用作另一个项目中的依赖项。但是,即使它是Spring Boot应用程序,我们也不能使用java -jar JAR_FILE执行JAR文件 。这是因为没有捆绑运行时依赖项。例如,我们没有Servlet容器来启动Web上下文。
要使用简单的java -jar命令启动Spring Boot应用程序 ,我们需要构建一个胖JAR。Spring Boot Maven插件可以帮助我们。
 
要实现SpringBoot重新打包,我们需要在pom.xml中添加Spring Boot Maven插件:

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

重新·打包命令:
mvn clean spring-boot:repackage 

这个命令需要在现有JAR或WAR存档为源,将项目类重新打包,包括所有项目运行时依赖都包括在一起。这样,可以使用命令行java -jar JAR_FILE.jar来执行重新打包好的JAR文件。
因此,我们需要在执行spring-boot:repackage目标之前先构建JAR文件 :
mvn clean package spring-boot:repackage

以上命令才是正确重新打包命令。
通过jar tf target/spring-boot-artifacts-2.jar 可以检查打包好的JAR文件内容。在重新打包的JAR文件中,我们不仅具有来自项目的已编译Java类,而且还具有启动Spring Boot应用程序所需的所有运行时库。例如,嵌入式tomcat库被打包到BOOT-INF / lib 目录中。
我们可以在pom.xml中配置Spring Boot Maven插件, 以在Maven生命周期的打包阶段重新打包工件 。换句话说,当我们执行MVN包,spring-boot:repackage将自动执行。
<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

本文中的代码都可以在GitHub上找到