SpringBoot中如何部署Jar文件-創(chuàng)新互聯(lián)

這篇文章主要介紹“SpringBoot中如何部署Jar文件”,在日常操作中,相信很多人在SpringBoot中如何部署Jar文件問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”SpringBoot中如何部署Jar文件”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、昌江黎族網(wǎng)絡(luò)推廣、成都微信小程序、昌江黎族網(wǎng)絡(luò)營(yíng)銷、昌江黎族企業(yè)策劃、昌江黎族品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供昌江黎族建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:muchs.cn

主要配置:

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特別注意:
    項(xiàng)目?jī)H僅是為了演示配置方便,直接在parent的build部分做了插件配置和運(yùn)行定義。
    但是實(shí)際項(xiàng)目中需要把這些定義只放到spring boot模塊項(xiàng)目(可優(yōu)化使用pluginManagement形式),避免干擾其他util、common等模塊項(xiàng)目
    -->
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

配置輸出:

cd package-optimize-level0
mvn clean install

ls -lh package-optimize-app1/target/package-optimize-app1.jar
-rw-r--r--  1 lixia  wheel    16M Feb 24 21:06 package-optimize-app1/target/package-optimize-app1.jar

java -jar package-optimize-app1/target/package-optimize-app1.jar

重點(diǎn)說明:

  • (當(dāng)前演示應(yīng)用僅依賴了spring-boot-starter-web極少組件,所有構(gòu)建輸出只有十來MB)實(shí)際情況單一構(gòu)建根據(jù)項(xiàng)目依賴組件量輸出jar一般在幾十MB到一兩百M(fèi)B甚至更大。

  • 假如有十來個(gè)微服務(wù)需要部署,那就意味著需要傳輸一兩個(gè)GB的文件,耗時(shí)可想而知。就算是單一更新個(gè)別微服務(wù)也需要傳輸一兩百M(fèi)B。

Level 1:常見的依賴jar分離構(gòu)建方式

參考項(xiàng)目目錄:package-optimize-level1

關(guān)解決問題:

  • 降低單個(gè)微服務(wù)jar的文件大小,以便部署過程秒傳文件。 主要配置:

重點(diǎn)配置說明請(qǐng)?jiān)斠娙缦伦⑨屨f明:

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特別注意:
    項(xiàng)目?jī)H僅是為了演示配置方便,直接在parent的build部分做了插件配置和運(yùn)行定義。
    但是實(shí)際項(xiàng)目中需要把這些定義只放到spring boot模塊項(xiàng)目(可優(yōu)化使用pluginManagement形式),避免干擾其他util、common等模塊項(xiàng)目
    -->
    <plugins>
        <!-- 拷貝項(xiàng)目所有依賴jar文件到構(gòu)建lib目錄下 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <excludeTransitive>false</excludeTransitive>
                        <stripVersion>false</stripVersion>
                        <silent>true</silent>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Spring Boot模塊jar構(gòu)建 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includes>
                    <!-- 不存在的include引用,相當(dāng)于排除所有maven依賴jar,沒有任何三方j(luò)ar文件打入輸出jar -->
                    <include>
                        <groupId>null</groupId>
                        <artifactId>null</artifactId>
                    </include>
                </includes>
                <layout>ZIP</layout>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

配置輸出:

cd package-optimize-level1
mvn clean install

ls -lh package-optimize-app1/target/package-optimize-app1.jar
-rw-r--r--  1 lixia  wheel   149K Feb 24 20:56 package-optimize-app1/target/package-optimize-app1.jar

java -jar -Djava.ext.dirs=lib package-optimize-app1/target/package-optimize-app1.jar

實(shí)現(xiàn)效果:

  • 單一構(gòu)建根據(jù)項(xiàng)目依賴組件量輸出jar一般僅有一兩百KB,基本可以做到秒傳。

  • 這個(gè)是網(wǎng)上可見最常見的優(yōu)化方案,還值得繼續(xù)深入:假如有十來個(gè)微服務(wù),每個(gè)服務(wù)一個(gè)jar和一個(gè)lib目錄文件,首次部署也差不多需要傳輸一兩個(gè)GB文件。

Level 2:合并所有模塊依賴jar到同一個(gè)lib目錄

參考項(xiàng)目目錄:package-optimize-level2

解決問題:

  • 合并所有模塊依賴jar到同一個(gè)lib目錄,一般由于各模塊項(xiàng)目依賴jar重疊程度很高,合并所有服務(wù)部署文件總計(jì)大小基本也就兩三百M(fèi)B

  • 但是如果采用-Djava.ext.dirs=lib加載所有jar到每個(gè)JVM,一來每個(gè)JVM都完整加載了所有jar耗費(fèi)資源,二來各微服務(wù)組件版本不同會(huì)出現(xiàn)版本沖突問題

主要配置:

重點(diǎn)配置說明請(qǐng)?jiān)斠娙缦伦⑨屨f明:

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特別注意:
    項(xiàng)目?jī)H僅是為了演示配置方便,直接在parent的build部分做了插件配置和運(yùn)行定義。
    但是實(shí)際項(xiàng)目中需要把這些定義只放到spring boot模塊項(xiàng)目(可優(yōu)化使用pluginManagement形式),避免干擾其他util、common等模塊項(xiàng)目
    -->
    <plugins>
        <!-- 基于maven-jar-plugin插件實(shí)現(xiàn)把依賴jar定義寫入輸出jar的META-INFO/MANIFEST文件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <useUniqueVersions>false</useUniqueVersions>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <!-- 拷貝項(xiàng)目所有依賴jar文件到構(gòu)建lib目錄下 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <!--
                        各子模塊按照實(shí)際層級(jí)定義各模塊對(duì)應(yīng)的屬性值,檢查所有微服務(wù)模塊依賴jar文件合并復(fù)制到同一個(gè)目錄
                        詳見各子模塊中 boot-jar-output 屬性定義
                        -->
                        <outputDirectory>${boot-jar-output}/lib</outputDirectory>
                        <excludeTransitive>false</excludeTransitive>
                        <stripVersion>false</stripVersion>
                        <silent>false</silent>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Spring Boot模塊jar構(gòu)建 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includes>
                    <!-- 不存在的include引用,相當(dāng)于排除所有maven依賴jar,沒有任何三方j(luò)ar文件打入輸出jar -->
                    <include>
                        <groupId>null</groupId>
                        <artifactId>null</artifactId>
                    </include>
                </includes>
                <layout>ZIP</layout>
                <!--
                基于maven-jar-plugin輸出微服務(wù)jar文件進(jìn)行二次spring boot重新打包文件的輸出目錄
                所有微服務(wù)構(gòu)建輸出jar文件統(tǒng)一輸出到與lib同一個(gè)目錄,便于共同引用同一個(gè)lib目錄
                詳見各子模塊中boot-jar-output屬性定義
                -->
                <!--  -->
                <outputDirectory>${boot-jar-output}</outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

所有l(wèi)ib目錄文件及各微服務(wù)構(gòu)建jar聚合到devops公共目錄。

微服務(wù)jar文件中的META-INFO/MANIFEST文件中會(huì)生成根據(jù)模塊依賴組件列表的Class-Path屬性, 從而避免了不同版本jar:

Class-Path: lib/spring-boot-starter-web-2.4.3.jar lib/spring-boot-starte
 r-2.4.3.jar lib/spring-boot-2.4.3.jar lib/spring-boot-autoconfigure-2.4
 .3.jar lib/spring-boot-starter-logging-2.4.3.jar lib/logback-classic-1.
 2.3.jar lib/logback-core-1.2.3.jar lib/slf4j-api-1.7.30.jar lib/log4j-t
 o-slf4j-2.13.3.jar lib/log4j-api-2.13.3.jar lib/jul-to-slf4j-1.7.30.jar
  lib/jakarta.annotation-api-1.3.5.jar lib/spring-core-5.3.4.jar lib/spr
 ing-jcl-5.3.4.jar lib/snakeyaml-1.27.jar lib/spring-boot-starter-json-2
 .4.3.jar lib/jackson-databind-2.11.4.jar lib/jackson-annotations-2.11.4
 .jar lib/jackson-core-2.11.4.jar lib/jackson-datatype-jdk8-2.11.4.jar l
 ib/jackson-datatype-jsr310-2.11.4.jar lib/jackson-module-parameter-name
 s-2.11.4.jar lib/spring-boot-starter-tomcat-2.4.3.jar lib/tomcat-embed-
 core-9.0.43.jar lib/jakarta.el-3.0.3.jar lib/tomcat-embed-websocket-9.0
 .43.jar lib/spring-web-5.3.4.jar lib/spring-beans-5.3.4.jar lib/spring-
 webmvc-5.3.4.jar lib/spring-aop-5.3.4.jar lib/spring-context-5.3.4.jar 
 lib/spring-expression-5.3.4.jar

配置輸出:

cd package-optimize-level2
mvn clean install

ls -lh devops/
total 912
drwxr-xr-x  34 lixia  wheel   1.1K Feb 24 22:27 lib
-rw-r--r--   1 lixia  wheel   150K Feb 24 22:31 package-optimize-app1.jar
-rw-r--r--   1 lixia  wheel   149K Feb 24 22:31 package-optimize-app2.jar
-rw-r--r--   1 lixia  wheel   149K Feb 24 22:31 package-optimize-app3.jar

java -jar devops/package-optimize-app1.jar

實(shí)現(xiàn)效果:

  • 啟動(dòng)過程不再需要 -Djava.ext.dirs=lib 參數(shù)定義。

  • 所有微服務(wù)jar引用所有項(xiàng)目合并依賴組件的公共目錄,部署文件總計(jì)大小一般在兩三百M(fèi)B。

  • 通過定制每個(gè)微服務(wù)jar文件中的META-INFO/MANIFEST文件中的Class-Path明確指明依賴版本組件類,解決各微服務(wù)不同組件版本沖突問題。

Level 3:支持system引入的非官方的三方依賴組件

參考項(xiàng)目目錄:package-optimize-level3

解決問題:

  • 有些非官方三方的諸如sdk jar,一種做法是提交到Maven本地游戲中去引用,那和普通依賴jar處理相同;但是在沒有maven游戲的情況下,常見的簡(jiǎn)化做法都是直接在項(xiàng)目中放置依賴jar然后在pom中以system scope方式定義。

  • 對(duì)于在pom中是以systemPath方式引入的,maven-jar-plugin組件沒有直接參數(shù)聲明包含指定scope的組件, 如果不做特殊處理META-INFO/MANIFEST中不會(huì)出現(xiàn)這些scope定義的組件,導(dǎo)致運(yùn)行時(shí)類找不到。

主要配置:

重點(diǎn)配置說明請(qǐng)?jiān)斠娙缦伦⑨屨f明:

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特別注意:
    項(xiàng)目?jī)H僅是為了演示配置方便,直接在parent的build部分做了插件配置和運(yùn)行定義。
    但是實(shí)際項(xiàng)目中需要把這些定義只放到spring boot模塊項(xiàng)目(可優(yōu)化使用pluginManagement形式),避免干擾其他util、common等模塊項(xiàng)目
    -->
    <plugins>
        <!-- 基于maven-jar-plugin插件實(shí)現(xiàn)把依賴jar定義寫入輸出jar的META-INFO/MANIFEST文件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <useUniqueVersions>false</useUniqueVersions>
                    </manifest>
                    <manifestEntries>
                        <!--
                        有些非官方三方的諸如sdk jar在pom中是以systemPath方式引入的,maven-jar-plugin組件沒有直接參數(shù)聲明包含指定scope的組件
                        通過使用額外定義 Class-Path 值來追加指定依賴組件列表,在子模塊按實(shí)際情況指定 jar-manifestEntries-classpath 值即可
                        例如(注意前面?zhèn)€點(diǎn)字符及各空格分隔符):. lib/xxx-1.0.0.jar lib/yyy-2.0.0.jar
                        詳見各子模塊中 boot-jar-output 屬性定義示例
                        -->
                        <Class-Path>${jar-manifestEntries-classpath}</Class-Path>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
        <!-- 拷貝項(xiàng)目所有依賴jar文件到構(gòu)建lib目錄下 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <!--
                        各子模塊按照實(shí)際層級(jí)定義各模塊對(duì)應(yīng)的屬性值,檢查所有微服務(wù)模塊依賴jar文件合并復(fù)制到同一個(gè)目錄
                        詳見各子模塊中 boot-jar-output 屬性定義
                        -->
                        <outputDirectory>${boot-jar-output}/lib</outputDirectory>
                        <excludeTransitive>false</excludeTransitive>
                        <stripVersion>false</stripVersion>
                        <silent>false</silent>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Spring Boot模塊jar構(gòu)建 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includes>
                    <!-- 不存在的include引用,相當(dāng)于排除所有maven依賴jar,沒有任何三方j(luò)ar文件打入輸出jar -->
                    <include>
                        <groupId>null</groupId>
                        <artifactId>null</artifactId>
                    </include>
                </includes>
                <layout>ZIP</layout>
                <!--
                基于maven-jar-plugin輸出微服務(wù)jar文件進(jìn)行二次spring boot重新打包文件的輸出目錄
                所有微服務(wù)構(gòu)建輸出jar文件統(tǒng)一輸出到與lib同一個(gè)目錄,便于共同引用同一個(gè)lib目錄
                詳見各子模塊中boot-jar-output屬性定義
                -->
                <!--  -->
                <outputDirectory>${boot-jar-output}</outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

子模塊主要配置:

    <properties>
        <!-- 按各模塊實(shí)際目錄層次定義相對(duì)數(shù)據(jù),使所有服務(wù)模塊輸出資源匯聚到相同目錄 -->
        <boot-jar-output>../devops</boot-jar-output>
        <!--
        有些供應(yīng)商的sdk jar在pom中是以systemPath方式引入的,maven-jar-plugin組件沒有直接參數(shù)聲明包含指定scope的組件
        通過使用額外定義 Class-Path 值來追加指定依賴組件列表,按實(shí)際情況指定 jar-manifestEntries-classpath 值即可
        例如(注意前面?zhèn)€點(diǎn)字符及各空格分隔符,lib后面部分是 artifactId-version.jar 格式而不是實(shí)際文件名):. lib/xxx-1.0.0.jar lib/yyy-2.0.0.jar
        -->
        <jar-manifestEntries-classpath>. lib/hik-sdk-1.0.0.jar</jar-manifestEntries-classpath>
    </properties>
    <dependencies>
        <!-- 以相對(duì)路徑方式定義非官方三方依賴組件 -->
        <dependency>
            <groupId>com.hik</groupId>
            <artifactId>hik-sdk</artifactId>
            <version>1.0.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/hik-sdk-1.0.0.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

微服務(wù)輸出jar文件中的META-INFO/MANIFEST文件中會(huì)生成根據(jù)模塊依賴組件列表的Class-Path屬性, 最前面會(huì)追加 jar-manifestEntries-classpath 屬性定義值:

Class-Path: . lib/hik-sdk-1.0.0.jar lib/spring-boot-starter-web-2.4.3.ja
 r lib/spring-boot-starter-2.4.3.jar lib/spring-boot-2.4.3.jar lib/sprin
 g-boot-autoconfigure-2.4.3.jar lib/spring-boot-starter-logging-2.4.3.ja
 r lib/logback-classic-1.2.3.jar lib/logback-core-1.2.3.jar lib/slf4j-ap
 i-1.7.30.jar lib/log4j-to-slf4j-2.13.3.jar lib/log4j-api-2.13.3.jar lib
 /jul-to-slf4j-1.7.30.jar lib/jakarta.annotation-api-1.3.5.jar lib/sprin
 g-core-5.3.4.jar lib/spring-jcl-5.3.4.jar lib/snakeyaml-1.27.jar lib/sp
 ring-boot-starter-json-2.4.3.jar lib/jackson-databind-2.11.4.jar lib/ja
 ckson-annotations-2.11.4.jar lib/jackson-core-2.11.4.jar lib/jackson-da
 tatype-jdk8-2.11.4.jar lib/jackson-datatype-jsr310-2.11.4.jar lib/jacks
 on-module-parameter-names-2.11.4.jar lib/spring-boot-starter-tomcat-2.4
 .3.jar lib/tomcat-embed-core-9.0.43.jar lib/jakarta.el-3.0.3.jar lib/to
 mcat-embed-websocket-9.0.43.jar lib/spring-web-5.3.4.jar lib/spring-bea
 ns-5.3.4.jar lib/spring-webmvc-5.3.4.jar lib/spring-aop-5.3.4.jar lib/s
 pring-context-5.3.4.jar lib/spring-expression-5.3.4.jar

配置輸出:

cd package-optimize-level3
mvn clean install

ls -lh devops/
total 912
drwxr-xr-x  36 lixia  wheel   1.1K Feb 24 23:14 lib
-rw-r--r--@  1 lixia  wheel   150K Feb 24 23:14 package-optimize-app1.jar
-rw-r--r--   1 lixia  wheel   150K Feb 24 23:14 package-optimize-app2.jar
-rw-r--r--   1 lixia  wheel   150K Feb 24 23:14 package-optimize-app3.jar

java -jar devops/package-optimize-app1.jar

最終實(shí)現(xiàn)效果

  • 所有服務(wù)的依賴組件合并到一個(gè)目錄,總計(jì)大小在兩三百M(fèi)B,首次部署傳輸效率明顯提速。

  • 各微服務(wù)jar一兩百KB大小,日常緊急修復(fù)Bug更新個(gè)別jar基本就是瞬間秒傳。

  • 各微服務(wù)jar中各自定義依賴指定版本組件列表,不會(huì)出現(xiàn)組件不同版本加載沖突問題。

  • 非官方的三方依賴組件也能正常引用處理。

到此,關(guān)于“SpringBoot中如何部署Jar文件”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

新聞名稱:SpringBoot中如何部署Jar文件-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://muchs.cn/article4/dejpoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、定制開發(fā)、外貿(mào)建站、App開發(fā)、標(biāo)簽優(yōu)化、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)