maven工程中jar包瘦身的五種方法
java項目中常用maven工具來進行工程管理,但經(jīng)常遇到的一個問題是生成的jar包越來越大,編譯一次工程越來越慢。怎么有效地去除冗余依賴,給jar包進行瘦身,是一項必備技能。下面介紹在maven工程中jar包瘦身五大法:
一、將環(huán)境中已包含的依賴包的scope設(shè)置為provided
pom中依賴的部分包可能在你程序運行環(huán)境中已經(jīng)包含,此時應(yīng)該將依賴包的scope設(shè)置為provided。如protobuf包如在環(huán)境中已包含,則應(yīng)設(shè)置為:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>${protobuf.version}</version>
<scope>provided</scope>
</dependency>
二、刪除未使用依賴
在pom文件配置時可能加入的某些依賴包并沒有真正被使用到,那么有沒有一種有效的方式找到?jīng)]有被使用到的依賴包呢?答案是Apache Maven Dependency Plugin。
安裝Apache Maven Dependency Plugin插件并運行mvn dependency:analyze命令來分析項目的依賴關(guān)系,并確定哪些依賴是:使用且聲明的、使用且未聲明的和未使用且聲明的。將未使用且聲明的的依賴從pom文件中去除即可。
如果你使用的是Spring Boot,可以直接添加這個插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
</plugins>
</build>
三、去除重復(fù)依賴
在pom文件中有些依賴可能在<dependencies/>或<dependencyManagement/>中被重復(fù)配置,或者父子項目配置中可能同一個依賴包被重復(fù)配置??赏ㄟ^Apache Maven Dependency Plugin插件并運行mvn dependency:analyze-duplicate命令來檢查項目的重復(fù)依賴,然后刪除重復(fù)依賴項即可。
四、解決依賴沖突
項目中不同的依賴包可以同時依賴另一個包,而這個嵌套依賴的包可能版本不一致,這可能導(dǎo)致程序無法正常運行,或者運行過程中產(chǎn)生一些很詭異的問題。
那如何方便地找到所有的依賴沖突項并解決呢?在intellij中安裝maven helper插件可快速找出有沖突的包。
安裝完maven helper后,然后打開pom文件,并從Text模式切換到Dependency Analyzer模式,選中Conflicts按鈕,可清晰地看到有沖突依賴包都被標紅顯示出來了。
選中紅色嵌套包并右鍵選擇Exclue即可,實際的效果是在pom文件中對應(yīng)的dependency下將嵌套包exclusion出去了。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.manager}</version>
<exclusions>
<exclusion>
<artifactId>jboss-logging</artifactId>
<groupId>org.jboss.logging</groupId>
</exclusion>
</exclusions>
</dependency>
某些場景下exclusion沖突的不同版本的依賴包會導(dǎo)致程序無法執(zhí)行,可能的原因是該依賴包無法在其嵌套包的其他版本下正常運行。此時可能需要嘗試找一個新版本的依賴包使其依賴的嵌套包能與其他依賴包達到兼容。
五、去除指定文件
如果采取了上面幾個步驟后還是無法達到j(luò)ar包有效瘦身的目標,那就只能使用最終大殺器:將不需要的指定文件或者文件夾從最終的jar包中移除。
之所以有不需要的文件被打到j(luò)ar包,一方面可能工程中包含了一些非代碼的工程文件,如項目文檔等;另一方面可能你依賴的jar包中包含了不需要的冗余文件。
使用maven-shade-plugin插件可將匹配特定條件的文件從jar包中移除。如下所示,配置exclude項可從最終的jar包中去除匹配特定條件的文件或文件夾(可以是配置文件,也可以是代碼文件)。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<id>uber-jar</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>${project.artifactId}-${project.version}-jar-with-dependencies</finalName>
<filters>
<filter>
<artifact>*:* </artifact>
<excludes>
<exclude>LICENSE</exclude>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
以上就是maven工程中jar包瘦身的五種方法的詳細內(nèi)容,更多關(guān)于maven工程中jar包瘦身的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
談?wù)凧ava中try-catch-finally中的return語句
我們知道return語句用在某一個方法中,一是用于返回函數(shù)的執(zhí)行結(jié)果,二是用于返回值為void類型的函數(shù)中,僅僅是一個return語句(return ;),此時用于結(jié)束方法的執(zhí)行,也即此return后的語句將不會被執(zhí)行,當然,這種情況下return語句后不能再有其它的語句了2016-01-01
SpringMVC響應(yīng)視圖和結(jié)果視圖詳解
這篇文章主要介紹了SpringMVC響應(yīng)視圖和結(jié)果視圖,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
解讀java.lang.Character.isLetterOrDigit()的使用方式
這篇文章主要介紹了解讀java.lang.Character.isLetterOrDigit()的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
springboot?serviceImpl初始化注入對象實現(xiàn)方式
這篇文章主要介紹了springboot?serviceImpl初始化注入對象實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
SpringSecurity登錄使用JSON格式數(shù)據(jù)的方法
這篇文章主要介紹了SpringSecurity登錄使用JSON格式數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
Java實現(xiàn)調(diào)用對方http接口得到返回數(shù)據(jù)
這篇文章主要介紹了Java實現(xiàn)調(diào)用對方http接口得到返回數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot用JdbcTemplates訪問Mysql實例代碼
本篇文章主要介紹了SpringBoot用JdbcTemplates訪問Mysql實例代碼,非常具有實用價值,需要的朋友可以參考下2017-05-05

