Maven打包SpringBoot項目,排除第三方依賴包

問題背景

Spring Boot 項目一般會依賴較多的包括 Spring 在內的第三方 jar 包,直接打可運行 jar 包,文件大小往往會達到100M甚至更大;

一個包含數個業務模塊的微服務項目,全部可運行的 jar 包加起來總共可達數百M甚至上G;

我們在重複部署測試或者生產環境的時候,每次都要上傳包含所有依賴 jar 包的可運行 jar 文件,效率比較低;

期望目標

下面是經過驗證的 maven 配置,Spring Boot 項目打包時,只包含我們自己的開發的代碼內容,大小僅僅之後數百 kb,所依賴的第三方 jar 則複製到指定的目錄下;

這樣我們可以只需要上傳一次第三方 jar,每次修改代碼重新部署時,只上傳僅包含我們開發代碼的 jar 文件,大大提高了部署效率。

解決方法

maven 的 pom 配置如下,${} 變量根據自己的項目進行替換,第三方 jar 指定到 target/lib 目錄下:

<plugins>
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>${java.version}</source>
            <target>${java.version}</target>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <!-- 跳過單元測試 -->
            <skipTests>true</skipTests>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <!-- 複製第三方 jar 到項目目錄下的 target/lib/ 下 -->
            <execution>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    <excludeScope>provided</excludeScope>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <!-- 指定 Spring Boot 啓動類,實際測試中必須 -->
                    <mainClass>${project.main.class}</mainClass>
                    <!-- 將所有第三方 jar 添加到項目 jar 的 MANIFEST.MF 文件中,這樣運行 jar 時依賴包才能被加載 -->
                    <addClasspath>true</addClasspath>
                    <!-- 指定複製第三方 jar 的目標目錄爲 target/lib/-->
                    <classpathPrefix>./lib/</classpathPrefix>
                </manifest>
            </archive>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <!-- repackage 時排除掉 第三方依賴 jar 文件,我們的可運行 Spring Boot 的 jar 文件瞬間變小 ^_^ -->
        <executions>
            <execution>
                <goals>
                    <goal>repackage</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <includes>
                <include>
                    <groupId>nothing</groupId>
                    <artifactId>nothing</artifactId>
                </include>
            </includes>
        </configuration>
    </plugin>
</plugins>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章