SpringBoot?項(xiàng)目瘦身maven/gradle詳解
maven thin jar 步驟
spring-boot-maven-plugin configuration layout ZIP includes include non-exists maven-dependency-plugin excutions excution goal copy-dependencies configuration outputDirectory
<build> <finalName>thin-jar</finalName> <!--java -jar -Dloader.path=./lib thin-jar.jar--> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring.boot.version}</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <!-- fork=true 新開 Jvm 運(yùn)行插件 --> <fork>true</fork> <addResources>true</addResources> <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments> <layout>ZIP</layout> <includes> <include> <groupId>non-exists</groupId> <artifactId>non-exists</artifactId> </include> </includes> </configuration> </plugin> <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> <!--是否去掉jar包版本信息--> <stripVersion>false</stripVersion> <!--包含范圍--> <includeScope>runtime</includeScope> </configuration> </execution> </executions> </plugin> </plugins> </build>
<fork>false</fork>
表示 Maven 使用自身的 JVM 虛擬機(jī)運(yùn)行插件, 而 <fork>true</fork>
則告知 Maven 啟動(dòng)一個(gè)新的 JVM 虛擬機(jī)進(jìn)程運(yùn)行插件. 使用 spring-boot-devtools 模塊時(shí)需要特定 JVM 配置來運(yùn)行, 所以需要?jiǎng)?chuàng)建新的 JVM 虛擬機(jī)進(jìn)程來運(yùn)行. 所以通常使用 spring-boot-devtools 熱部署時(shí), 需要在 spring-boot-maven-plugin 插件上會(huì)加上 fork=true
<layout>ZIP</layout>
MANIFEST.MF 文件中 Main-Class 是 PropertiesLauncher, 就是 spring-boot-maven-plugin 插件配置 <layout>ZIP</layout>
的結(jié)果
- layout:
- JAR,即通常的可執(zhí)行jar
- Main-Class: org.springframework.boot.loader.JarLauncher
- WAR,即通常的可執(zhí)行war,需要的servlet容器依賴位于WEB-INF/lib-provided
- Main-Class: org.springframework.boot.loader.warLauncher
- ZIP,即DIR,類似于JAR
- Main-Class: org.springframework.boot.loader.PropertiesLauncher
- MODULE,將所有的依賴庫(kù)打包(scope為provided的除外),但是不打包Spring Boot的任何Launcher
- NONE,將所有的依賴庫(kù)打包,但是不打包Spring Boot的任何Launcher
- 此外
<classifier>suffix</classifier>
project-1.1.1-suffix 與 mvn package 所打成的 jar 進(jìn)行區(qū)分 - mvn package 打包時(shí)使用 maven-jar-plugin 插件執(zhí)行 package 命令, 生成的 jar 不包含依賴, 不可以執(zhí)行但可以作為依賴引用
- 使用 spring-boot-maven-plugin 插件打包將 mvn package 生成的軟件包重命名為了 *.original
Gradle thin jar
task clearJar(type: Delete) { delete "$buildDir/libs/lib" } // 將依賴包復(fù)制到lib目錄 task copyJar(type: Copy, dependsOn: 'clearJar') { into "$buildDir/libs/lib" from configurations.runtime // from configurations.compileClasspath } bootJar { // mainClassName = '' // 例外所有的jar excludes = ["*.jar"] // lib目錄的清除和復(fù)制任務(wù) dependsOn clearJar dependsOn copyJar // 指定依賴包的路徑, 無需 java.ext.dir 或 loader.path 參數(shù) manifest { attributes "Manifest-Version": 1.0, 'Class-Path': configurations.compileClasspath.files.collect { "lib/$it.name" }.join(' ') } }
需要把 dependencies 放到了 bootJar{} 之前
調(diào)用 bootJar 打包
運(yùn)行的時(shí)候也不需要指定 -Djava.ext.dirs=./lib 或 -Dloader.path=./lib 了, 將 lib 目錄放在 jar 包同級(jí)目錄下, 直接 -jar運(yùn)行就可以了
# java -Djava.ext.dirs=./lib -jar bootrun.jar java -jar bootrun.jar
loader.path
loader.path 是 Spring 提供的配置參數(shù)
可以使用 --classpath / -cp 指定類加載的路徑,但 classpath 的生效是有條件的
# 運(yùn)行 class 生效 java -cp .;lib/x.jar Test # 運(yùn)行 jar 失效 java -cp lib/x.jar -jar app.jar
使用 java -jar boot.jar
時(shí) (此時(shí) -cp 無效), 可以使用 loader.path
指定類加載路徑加載其他 jar, loader.path
實(shí)現(xiàn)了 classpath
的功能
但 loader.path 生效是有條件的
當(dāng) MANIFEST.MF 的 Main-Class 為:
- PropertiesLauncher (額外配置) 生效
- JarLauncher (默認(rèn)配置) 失效 (啟動(dòng)會(huì)快一些)
為了使用 loader.path,需要把 jar 包的 Main-Class 配置為 PropertiesLauncher,在 build.gradle 中如下配置,可參考 Using the PropertiesLauncher
bootJar { manifest { attributes 'Main-Class': 'org.springframework.boot.loader.PropertiesLauncher' } }
So by adding all the needed classpaths to the loader.path variable, spring will be able to boostrap the application. (details)
到此這篇關(guān)于SpringBoot 項(xiàng)目瘦身(maven/gradle)的文章就介紹到這了,更多相關(guān)SpringBoot 瘦身maven/gradle內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之位圖的簡(jiǎn)單實(shí)現(xiàn)和使用
位圖,?是一種非常常見的結(jié)構(gòu),?它使用每個(gè)二進(jìn)制位來存放一個(gè)值的狀態(tài),?就類似于?Java?當(dāng)中?HashSet?存儲(chǔ)元素的功能。本文主要來介紹一下位圖的簡(jiǎn)單實(shí)現(xiàn)和使用,需要的可以參考一下2023-05-05java網(wǎng)上圖書商城(5)購(gòu)物車模塊2
這篇文章主要為大家詳細(xì)介紹了java網(wǎng)上圖書商城,購(gòu)物車模塊第二篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12springBoo3.0集成knife4j4.1.0的詳細(xì)教程(swagger3)
這篇文章主要介紹了springBoo3.0集成knife4j4.1.0的詳細(xì)教程(swagger3),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07Java中final作用于變量、參數(shù)、方法及類該如何處理
Java中的final關(guān)鍵字非常重要,它可以應(yīng)用于類、方法以及變量,下面這篇文章主要給大家介紹了關(guān)于Java中final作用于變量、參數(shù)、方法及類該如何處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-12-12