Maven清理java項(xiàng)目中未使用到 jar 依賴包的方法
一、為什么要做這件事?
自從我踏入職場,便歷經(jīng)了技術(shù)革新的數(shù)次浪潮。從最初的.Net Framework、Winform、WPF,到Asp.Net MVC、Asp.Net MVC WebApi,再到Asp.Net Core 2.x的廣泛應(yīng)用,我始終深耕于.net領(lǐng)域。然而,隨著技術(shù)的不斷演進(jìn),我逐漸發(fā)現(xiàn).net相關(guān)的工作機(jī)會變得稀少。在出租屋內(nèi),我自學(xué)了一個月的前端技術(shù),竟意外地獲得了進(jìn)入某知名企業(yè)的機(jī)會,從而開啟了全新的前端探索之旅。如今,我又邁入了運(yùn)維的新領(lǐng)域。回顧過往,每一步都充滿了挑戰(zhàn)與不易。
目前,我的主要工作是為客戶提供私有化項(xiàng)目的售后技術(shù)支持。在日常工作中,項(xiàng)目經(jīng)常會因?yàn)榭蛻舴降穆┒磼呙瓒┞冻鲆恍﹋ar包的漏洞問題,需要進(jìn)行緊急修復(fù)或升級。
二、怎么做?
對于Maven項(xiàng)目,處理起來相對簡單。Maven自身提供了一款強(qiáng)大的依賴分析工具,只需簡單的命令輸入即可輕松實(shí)現(xiàn)。在IntelliJ IDEA中,你可以切換到Terminal窗口,或者在命令行中導(dǎo)航至項(xiàng)目根目錄,執(zhí)行以下命令:
mvn dependency:analyze
隨后,仔細(xì)查看控制臺輸出的日志信息,特別關(guān)注以下幾個部分:
[INFO] --- maven-dependency-plugin:2.8:analyze (default-cli) @ xxxproject --- [WARNING] Used undeclared dependencies found: [WARNING] org.springframework:spring-beans:jar:4.0.0.RELEASE:compile [WARNING] org.springframework:spring-context:jar:4.0.0.RELEASE:compile [WARNING] Unused declared dependencies found: [WARNING] com.alibaba:dubbo:jar:2.5.3:compile [WARNING] com.baidu.disconf:disconf-client:jar:2.6.32:compile [WARNING] org.mybatis:mybatis:jar:3.2.7:compile [WARNING] org.mybatis:mybatis-spring:jar:1.2.2:compile [WARNING] mysql:mysql-connector-java:jar:5.1.41:compile [WARNING] com.alibaba:druid:jar:1.0.9:compile [WARNING] com.github.sgroschupf:zkclient:jar:0.1:compile [WARNING] org.apache.zookeeper:zookeeper:jar:3.4.6:compile [WARNING] org.springframework:spring-jdbc:jar:4.0.0.RELEASE:compile [WARNING] org.slf4j:log4j-over-slf4j:jar:1.7.5:compile [WARNING] org.slf4j:jcl-over-slf4j:jar:1.7.5:runtime [WARNING] ch.qos.logback:logback-classic:jar:1.0.13:compile
接下來,我們將詳細(xì)解讀日志中 Used undeclared dependencies found 和 Unused declared dependencies found
Used undeclared dependencies found
這一部分指的是項(xiàng)目中實(shí)際使用了某個依賴包,但并未在pom.xml文件中顯式聲明。這些依賴包可能是通過其他依賴間接引入的。
例如,假設(shè)你的項(xiàng)目在pom.xml中聲明了對A.jar的依賴,但未聲明對B.jar的依賴。而A.jar的依賴樹中又包含了對B.jar的依賴。通過運(yùn)行mvn dependency:analyze
命令,如果輸出如下警告:
mvn dependency:analyze
出現(xiàn)
[WARNING] Used undeclared dependencies found: B.jar
這意味著你的項(xiàng)目代碼中實(shí)際上使用了B.jar中的類或接口。在這種情況下,你應(yīng)該將B.jar添加到項(xiàng)目的pom.xml文件中,以確保依賴關(guān)系的正確聲明。
Unused declared dependencies found
這一部分則是指你在項(xiàng)目的pom.xml文件中聲明了某個依賴包,但在實(shí)際的項(xiàng)目代碼中并未使用到它。這些依賴包可能是不必要的,可以考慮從pom.xml中移除。
然而,在刪除這些依賴之前,請務(wù)必注意以下幾點(diǎn):
- “未使用”的定義僅限于main/java和test源代碼目錄,不包括配置文件或其他可能的擴(kuò)展點(diǎn)。
- 在刪除依賴之前,務(wù)必備份pom.xml文件,以防萬一誤刪重要依賴導(dǎo)致的問題。
- Maven的依賴分析工具并非萬能,有時可能會產(chǎn)生誤報(bào)。因此,在刪除任何依賴后,都應(yīng)進(jìn)行充分的測試以驗(yàn)證項(xiàng)目的穩(wěn)定性。
三、什么時候做?
- 新項(xiàng)目初始化時:在創(chuàng)建新項(xiàng)目并添加依賴時,務(wù)必謹(jǐn)慎選擇所需的jar包,避免盲目復(fù)制舊項(xiàng)目的依賴配置,從而減少后續(xù)不必要的清理工作。
- 功能代碼重構(gòu)時:在進(jìn)行功能代碼的重構(gòu)過程中,可以順便進(jìn)行一次依賴項(xiàng)的審查與清理。由于后續(xù)還有自測和提測等環(huán)節(jié),即使有誤刪的情況也能及時發(fā)現(xiàn)并修復(fù)。
四、有什么風(fēng)險(xiǎn)要注意的?
- 結(jié)果僅供參考:依賴分析工具的結(jié)果并非絕對準(zhǔn)確,可能存在誤判的情況。例如,某些工具可能無法識別某些特殊的使用場景(如注解處理器等)。因此,在刪除依賴后,請務(wù)必進(jìn)行全面的測試以驗(yàn)證項(xiàng)目的正確性。
- 老項(xiàng)目接手時的注意事項(xiàng):當(dāng)接手一個遺留的老項(xiàng)目時,可能會發(fā)現(xiàn)大量的依賴問題。然而,在初次接手時并不建議立即進(jìn)行此類操作。由于對項(xiàng)目的不熟悉,貿(mào)然刪除依賴可能會引發(fā)一系列難以定位的問題,從而浪費(fèi)大量的時間和精力。建議在充分了解項(xiàng)目結(jié)構(gòu)和業(yè)務(wù)邏輯后再進(jìn)行此類優(yōu)化工作。
五、補(bǔ)充一個快捷方法
使用 IntelliJ IDEA 自帶的 maven 工具
使用方法
- 打開IntelliJ IDEA,導(dǎo)航至項(xiàng)目的pom.xml文件所在目錄。
- 右鍵點(diǎn)擊pom.xml文件,選擇“Maven”菜單中的“Analyze Dependencies”選項(xiàng)。
- IntelliJ IDEA將自動分析項(xiàng)目的依賴關(guān)系,并在彈出的窗口中展示分析結(jié)果。你可以根據(jù)分析結(jié)果進(jìn)行相應(yīng)的操作,如添加缺失的依賴或刪除未使用的依賴等。
通過以上步驟,你可以在IntelliJ IDEA中輕松管理項(xiàng)目的依賴關(guān)系,確保項(xiàng)目的穩(wěn)定性和可維護(hù)性。
到此這篇關(guān)于Maven清理java項(xiàng)目中未使用到 jar 依賴包的方法的文章就介紹到這了,更多相關(guān)Maven清理jar 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java數(shù)據(jù)結(jié)構(gòu)與算法之快速排序詳解
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之快速排序,結(jié)合實(shí)例形式詳細(xì)分析了快速排序的原理、實(shí)現(xiàn)步驟、相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-05-05Java class文件格式之訪問標(biāo)志信息_動力節(jié)點(diǎn)Java學(xué)院整理
access_flags 描述的是當(dāng)前類(或者接口)的訪問修飾符, 如public, private等, 此外, 這里面還存在一個標(biāo)志位, 標(biāo)志當(dāng)前的額這個class描述的是類, 還是接口2017-06-06Java窗體中關(guān)于默認(rèn)布局管理器容易踩的坑及解決
這篇文章主要介紹了Java窗體中關(guān)于默認(rèn)布局管理器容易踩的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12淺談Spring Data JPA與MyBatisPlus的比較
本文主要介紹了淺談Spring Data JPA 與 MyBatisPlus的比較2024-08-08Spring 中jdbcTemplate 實(shí)現(xiàn)執(zhí)行多條sql語句示例
本篇文章主要介紹了Spring 中jdbcTemplate 實(shí)現(xiàn)執(zhí)行多條sql語句示例,可以對多個表執(zhí)行多個sql語句,有興趣的可以了解一下。2017-01-01IDEA 2019.2.2配置Maven3.6.2打開Maven項(xiàng)目出現(xiàn) Unable to import Maven
這篇文章主要介紹了IDEA 2019.2.2配置Maven3.6.2打開Maven項(xiàng)目出現(xiàn) Unable to import Maven project的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級緩存、二級緩存
這篇文章主要介紹了SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級緩存、二級緩存,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12