前言
SpringBoot部署起來配置非常少,如果伺服器部署在公司內網,上傳速度還行,但是如果部署在公網(阿里雲等雲伺服器上),部署起來實在頭疼、就是 編譯出來的 Jar 包很大,如果工程引入了許多開源元件(SpringCloud等),那就更大了。這個時候如果想要對線上執行工程有一些微調,則非常痛苦
可以用以下方法減少jar內容
瘦身準備
1、首先我們要對Jar包有一個初步認識,它的內部結構如下
example.jar
|
+-META-INF
| +-MANIFEST.MF
+-org
| +-springframework
| +-boot
| +-loader
| +-<spring boot loader classes>
+-BOOT-INF
+-classes
| +-mycompany
| +-project
| +-YourClasses.class
+-lib // 依賴庫的包
+-dependency1.jar
+-dependency2.jar
複製程式碼
執行該Jar時預設從BOOT-INF/classes載入class,從BOOT-INF/lib載入所依賴的Jar包。如果想要加入外部的依賴Jar,可以通過設定環境變數LOADER_PATH來實現。
如此一來,就可以確認我們的思路了:
-
把那些不變的依賴Jar包(比如spring依賴、資料庫Driver等,這些在不升級版本的情況下是不會更新的)從Flat Jar中抽離到單獨的目錄,如libs
-
在啟動Jar時,設定LOADER_PATH使用上一步的libs
java -Dloader.path="libs/" -jar ht-ui-web.jar
複製程式碼
這樣,我們最終打包的jar包體積就大大減少,每次迭代後只需要更新這個精簡版的Jar即可。
需要在pom檔案配置忽略的依賴包。
- 關鍵需要配置
MANIFEST.MF
檔案中加入lib路徑。 - 然後正常啟動jar包就可以了。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!--不打包資原始檔-->
<!--<excludes>-->
<!--<exclude>*.**</exclude>-->
<!--<exclude>*/*.xml</exclude>-->
<!--</excludes>-->
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!--MANIFEST.MF 中 Class-Path 加入字首-->
<classpathPrefix>lib/</classpathPrefix>
<!--jar包不包含唯一版本標識-->
<useUniqueVersions>false</useUniqueVersions>
<!--指定入口類-->
<mainClass>com.XProApplication</mainClass>
</manifest>
<!--<manifestEntries>-->
<!--<!–MANIFEST.MF 中 Class-Path 加入資原始檔目錄–>-->
<!--<Class-Path>./resources/</Class-Path>-->
<!--</manifestEntries>-->
</archive>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
複製程式碼
完整pom檔案的內容如下。。
配置完畢打包專案就會將lib包和專案包分開放到target中。然後分開上傳內容。 以後就可以上傳精簡的jar包了
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<!--打包jar-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!--不打包資原始檔-->
<!--<excludes>-->
<!--<exclude>*.**</exclude>-->
<!--<exclude>*/*.xml</exclude>-->
<!--</excludes>-->
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!--MANIFEST.MF 中 Class-Path 加入字首-->
<classpathPrefix>lib/</classpathPrefix>
<!--jar包不包含唯一版本標識-->
<useUniqueVersions>false</useUniqueVersions>
<!--指定入口類-->
<mainClass>com.XProApplication</mainClass>
</manifest>
<!--<manifestEntries>-->
<!--<!–MANIFEST.MF 中 Class-Path 加入資原始檔目錄–>-->
<!--<Class-Path>./resources/</Class-Path>-->
<!--</manifestEntries>-->
</archive>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
<!--拷貝依賴 copy-dependencies-->
<!--也可以執行mvn copy-dependencies 命令打包依賴-->
<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>
</configuration>
</execution>
</executions>
</plugin>
<!--<!– 拷貝資原始檔 copy-resources–>-->
<!-- <plugin>-->
<!-- <artifactId>maven-resources-plugin</artifactId>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <id>copy-resources</id>-->
<!-- <phase>package</phase>-->
<!-- <goals>-->
<!-- <goal>copy-resources</goal>-->
<!-- </goals>-->
<!-- <configuration>-->
<!-- <resources>-->
<!-- <resource>-->
<!-- <directory>src/main/resources</directory>-->
<!-- </resource>-->
<!-- </resources>-->
<!-- <outputDirectory>${project.build.directory}/resources</outputDirectory>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>-->
<!--spring boot repackage,依賴 maven-jar-plugin 打包的jar包 重新打包成 spring boot 的jar包-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--重寫包含依賴,包含不存在的依賴,jar裡沒有pom裡的依賴-->
<includes>
<include>
<groupId>null</groupId>
<artifactId>null</artifactId>
</include>
</includes>
<layout>ZIP</layout>
<!--使用外部配置檔案,jar包裡沒有資原始檔-->
<addResources>true</addResources>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<!--配置jar包特殊標識 配置後,保留原檔案,生成新檔案 *-run.jar -->
<!--配置jar包特殊標識 不配置,原檔案命名為 *.jar.original,生成新檔案 *.jar -->
<!--<classifier>run</classifier>-->
</configuration>
</execution>
</executions>
</plugin>
</build>
```複製程式碼