SpringBoot的repackage和Maven打包命令之間的區別 - Baeldung

發表於2021-01-03

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上找到

 

相關文章