首頁 > 軟體

springboot打包實現專案JAR包和依賴JAR包分離

2022-02-18 16:00:29

寫在前面的

當我們使用spring boot寫專案時,一般都會遇到一個問題,那就是spring boot打包時,會將自己寫的程式碼和專案的所有依賴檔案打成一個可執行的jar包。

通常我們的專案都是執行在伺服器上的,當專案更新時,每次都要向伺服器上傳這個包。如果專案的依賴包很多,那麼這個檔案就會非常大。

大檔案上傳不僅浪費頻寬,有時候網路不穩定,傳輸一半斷網,又要重新上傳,非常麻煩。

預設的maven設定

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

如果能將專案外部依賴和自己的程式碼包分開打包,當修改專案後,只需要再次覆蓋修改後的包,那豈不是美滋滋?

解決方案

使用maven的assembly打包外掛

assembly設定

在專案中建立一個檔案,我放在src/main/assembly/assembly.xml中,大家可以根據喜好自己建立。

assembly中的具體設定

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <!--
        必須寫,否則打包時會有 assembly ID must be present and non-empty 錯誤
        這個名字最終會追加到打包的名字的末尾,如專案的名字為 speed-api-0.0.1-SNAPSHOT,
        則最終生成的包名為 speed-api-0.0.1-SNAPSHOT-bin.zip
     -->
    <id>bin</id>
    <!-- 打包後的檔案格式,可以是zip,tar,tar.gz,tar.bz2,jar,war,dir -->
    <formats>
        <format>zip</format>
    </formats>
    <!-- 壓縮包下是否生成和專案名相同的根目錄 -->
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <!-- 不使用專案的artifact,第三方jar不要解壓,打包進zip檔案的lib目錄 -->
            <useProjectArtifact>false</useProjectArtifact>
            <outputDirectory>lib</outputDirectory>
            <unpack>false</unpack>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <!-- 把專案相關的說明檔案,打包進zip檔案的根目錄 -->
        <fileSet>
            <directory>${project.basedir}</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>README*</include>
                <include>LICENSE*</include>
                <include>NOTICE*</include>
            </includes>
        </fileSet>
        <!-- 把專案的組態檔,打包進zip檔案的config目錄 -->
        <fileSet>
            <directory>${project.basedir}/src/main/resources</directory>
            <outputDirectory>config</outputDirectory>
        </fileSet>
        <!-- 把專案的指令碼檔案,打包進zip檔案的bin目錄 -->
        <fileSet>
            <directory>${project.basedir}/src/main/bin</directory>
            <outputDirectory>bin</outputDirectory>
        </fileSet>
        <!-- 把專案自己編譯出來的jar檔案,打包進zip檔案的根目錄 -->
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

maven中的設定

<build>
    <plugins>
        <!-- 指定啟動類,將依賴打成外部jar包 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <!-- 生成的jar中,不要包含pom.xml和pom.properties這兩個檔案 -->
                    <addMavenDescriptor>false</addMavenDescriptor>
                    <manifest>
                        <!-- 是否要把第三方jar放到manifest的classpath中 -->
                        <addClasspath>true</addClasspath>
                        <!-- 外部依賴jar包的最終位置 -->
                        <classpathPrefix>lib/</classpathPrefix>
                        <!-- 專案啟動類 -->
                        <mainClass>com.zbrx.speed.App</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <!-- 使用assembly打包 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptors>
                    <!-- assembly組態檔位置 -->
                    <descriptor>src/main/assembly/assembly.xml</descriptor>
                </descriptors>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!-- 打包釋出時,跳過單元測試 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skipTests>true</skipTests>
            </configuration>
        </plugin>
    </plugins>
</build>

最終打包後的效果

壓縮包裡的檔案內容

lib中的檔案

config組態檔

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com