SpringBoot?項目瘦身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 運行插件 -->
<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 虛擬機運行插件, 而 <fork>true</fork> 則告知 Maven 啟動一個新的 JVM 虛擬機進(jìn)程運行插件. 使用 spring-boot-devtools 模塊時需要特定 JVM 配置來運行, 所以需要創(chuàng)建新的 JVM 虛擬機進(jìn)程來運行. 所以通常使用 spring-boot-devtools 熱部署時, 需要在 spring-boot-maven-plugin 插件上會加上 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,將所有的依賴庫打包(scope為provided的除外),但是不打包Spring Boot的任何Launcher
- NONE,將所有的依賴庫打包,但是不打包Spring Boot的任何Launcher
- 此外
<classifier>suffix</classifier>project-1.1.1-suffix 與 mvn package 所打成的 jar 進(jìn)行區(qū)分 - mvn package 打包時使用 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 打包
運行的時候也不需要指定 -Djava.ext.dirs=./lib 或 -Dloader.path=./lib 了, 將 lib 目錄放在 jar 包同級目錄下, 直接 -jar運行就可以了
# java -Djava.ext.dirs=./lib -jar bootrun.jar java -jar bootrun.jar
loader.path
loader.path 是 Spring 提供的配置參數(shù)
可以使用 --classpath / -cp 指定類加載的路徑,但 classpath 的生效是有條件的
# 運行 class 生效 java -cp .;lib/x.jar Test # 運行 jar 失效 java -cp lib/x.jar -jar app.jar
使用 java -jar boot.jar 時 (此時 -cp 無效), 可以使用 loader.path 指定類加載路徑加載其他 jar, loader.path 實現(xiàn)了 classpath 的功能
但 loader.path 生效是有條件的
當(dāng) MANIFEST.MF 的 Main-Class 為:
- PropertiesLauncher (額外配置) 生效
- JarLauncher (默認(rèn)配置) 失效 (啟動會快一些)
為了使用 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 項目瘦身(maven/gradle)的文章就介紹到這了,更多相關(guān)SpringBoot 瘦身maven/gradle內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java將時間戳轉(zhuǎn)換為Date對象的方法小結(jié)
在?Java?編程中,處理日期和時間是一個常見需求,特別是在處理網(wǎng)絡(luò)通信或者數(shù)據(jù)庫操作時,本文主要為大家整理了Java中將時間戳轉(zhuǎn)換為Date對象的方法,希望對大家有所幫助2024-12-12
mybatis 連接mysql數(shù)據(jù)庫 tinyint 為boolean類型詳解
這篇文章主要介紹了mybatis 連接mysql數(shù)據(jù)庫 tinyint 為boolean類型詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
經(jīng)典的Java面試題及回答集錦(基礎(chǔ)篇)
本文給大家收藏整理了java面試題及回答,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2018-03-03
Java實現(xiàn)郵箱發(fā)送功能實例(阿里云郵箱推送)
這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)郵箱發(fā)送功能的相關(guān)資料,利用阿里云郵箱推送,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java中使用fileupload組件實現(xiàn)文件上傳功能的實例代碼
這篇文章主要介紹了Java中使用fileupload組件實現(xiàn)文件上傳功能的實例代碼,需要的朋友可以參考下2017-05-05

