java的包管理簡單學習記錄:
jvm的工作被設計的相當簡單:
執行一個類的字節碼,若碰到了新的類便加載它,在類路徑(-classpath /-cp)里可以找到類,類的全限定類名(目錄層級路徑)可以唯一地確定了一個類
包就是把許多類放在一起打包的壓縮包。
maven的包管理
在運行程序時,maven會從中央倉庫自動幫你下載依賴的包,每個項目所依賴的包寫在該項目中的pom.xml文件中,通常就是
pom.xml文件中如下面這種的dependency中的字段,通過groupId和artifactId可以確定第三方包中的唯一位置,加上版本號便可以唯一確定所需的包
<dependency> <groupId>org.kohsuke</groupId> <!-- 一般是組織名 --> <artifactId>github-api</artifactId> <!-- 一般是項目的模塊名 --> <version>1.95</version> <!-- 版本號 --> <scope>test</scope><!-- 和構建項目的生命周期相關 --> </dependency>
pom.xml文件中的scope語句可以指定依賴只在scope中生效,最常見的是用於在
test中運行test所需類
即 <scope> test<scope> 第三方依賴只在test中可見
若寫成<scope>compile<scope>則在main,test中都可見
若寫成<scope>provided<scope>:在編譯時可見,但運行時不可見(因為有時候別人會提供)
mvn包沖突的發生:
運行程序,拋出如下異常時,即發生了包沖突:
AbstractMethodError
NoClassDefFoundError
ClassNotFoundException
LinkageError
mvn包沖突發生的原因:
正常情況下,maven會根據你文件中所導入的包自動去幫你尋找你的項目的依賴庫,
以及依賴文件的依賴庫
一個比較常見的包沖突是你的項目里的不同文件依賴了一個相同的庫,這個庫在
不同文件里的版本還不相同,此時在Classpath 上就出現了多個同名類(他們只是版本不同)
同時出現在Classpath中,
當出現同名的庫時,maven選用庫的原則是
優先選擇離項目最近的那個庫(即層級結構最短的那個庫)
這種做法有時可以解決掉問題,但有時卻會發生問題(即選擇了那個我不想用的舊庫,而我新版本
的新庫由於類名相同但可能層級目錄稍遠卻被丟棄了),
此時就需要人工干預
mvn解決包沖突:
方法一:根據依賴樹與給出的依賴庫尋找差異
在idea的maven 下面,idea會列出當前項目所依賴的庫,你可以直接查看你所依賴的
的文件,當依賴庫較少時,你可以直接通過肉眼查看是否有沖突發生,
當然也可以在idea的終端窗口運行
mvn dependenty:tree
查看項目所列出的依賴庫,但是使用mvn dependenty:tree列出的是沖突
解決后的依賴庫,它自動丟棄了發生沖突的那個庫中的一個庫,這里也就是運行異常發生的原因
你可以對比maven中列出的依賴(沖突解決前的依賴)和
依賴樹中列出的依賴(沖突解決后的依賴)的差異
尋找是哪里沖突了
方法二:使用maven helper插件
從IDEA的Plugins中下載maven helper插件,重啟終端即可使用
在pom.xml文件內容下,會多出一個dependency analyzer窗口
窗口內會自動列出當前沖突的文件,右鍵即可查看依賴處源碼或是將該庫排除