maven 編譯和緩存
maven 入門是很容易的,但是用好比較難。經常是各種奇怪問題。
比如, 我一個maven工程的 依賴的jar 已經發生了變化: 可能類名、方法、字段都已經改了, 但我當前工程 卻沒報錯, 重新編譯也沒有出現任何問題, 但是呢, 你重啟一下idea ,問題就出來了!
why, 應該是還是各種緩存引起的!
首先, target 目錄下有之前編譯好的class, 如果不 clean 他們,那么我們 package 打包就不會重新編譯,也就是沒有 compile 這個步驟。 那么,依賴jar 修改引起的問題就不會暴露出來。 但是那個依賴問題是客觀存在的。
因為之前依賴的jar 是沒問題的, 但是現在的jar 已經不是最新的了, 按理說, 當前工程也是 必須需要重新編譯的, 但是呢, 我們可能會忘記, 比如我, 往往就是為了省事, 直接一個 install ,這個時候呢, 其實是不對的!
pom 能夠繼承的元素。
如何知道哪些 元素是繼承而來的?
pom 繼承
mvn dependency:tree >> D:/tree.txt
查看依賴樹中包含某個artifactId的依賴鏈(artifactId前面加上冒號)
mvn dependency:tree -Dincludes=:fastjson:
或者
查看依賴樹中包含某個groupId的依賴鏈(-Dincludes后面跟上groupId)
mvn dependency:tree -Dincludes=com.alibaba:
---
idea 和maven插件
有時候也經常遇到:
Error running 'umc-portal [clean]': No valid Maven installation found. Either set the home directory in the configuration dialog or set the M2_HOME environment variable on your system.
M2_HOME 我其實是有設置的,但是沒有啥用, 也就是說跟 M2_HOME 無關。(這么說, 也算是一個idea 插件的小bug)
打卡 config dialog 一看:
仔細一想, 這個大概是因為我切換了 idea 引起的
idea 從2020 升級到2021, 就出現了
C:/Program Files/JetBrains/IntelliJ IDEA 2020.2.3/plugins/maven/lib/maven3 應該是之前的目錄,后面卸載了 idea 2020, 但是仍然保留了一些殘留。
解決方法很簡單, 點擊選擇其他的 可用的 maven即可:
不過, Use Maven wrapper 也是不能選擇的,因為我沒有這個文件:
Maven Wrapper:
Maven Wrapper 是什么? 它是一個包裝器,我也沒有用過,看起來是需要 一個 Maven-Wrapper.properties文件, 我本地也沒有.mvn 目錄, 沒有那個properties文件
那么
idea 自帶的maven插件
Bundled (Maven 3)
什么是Bundled (Maven 3), 其實就是idea 自帶的maven, Bundled就是綁定的。 這個應該是安裝idea 的時候,選擇插件的界面選擇的。(記得默認就會有maven插件, 還好很多其他一大堆)
之前的idea 版本,好像還有 Bundled (Maven 2),
IDEA 中 maven 自帶 Bundled (Maven 2) 和 Bundled (Maven 3) 的文件目錄位置在 idea 安裝的 plugins 目錄中。
假設 IDEA 安裝目錄為:D:\work\ideaIU-2017.3.1.win\
Bundled (Maven 2)的目錄為:D:\work\ideaIU-2017.3.1.win\plugins\maven\lib\maven2
Bundled (Maven 3)的目錄為:D:\work\ideaIU-2017.3.1.win\plugins\maven\lib\maven3
settings.xml 優先級
默認的Bundled (Maven 3),當然 也有一個settings.xml,位於
C:\Program Files\JetBrains\IntelliJ IDEA 2021.1\plugins\maven\lib\maven3\conf\settings.xml
但是呢,這個可能不是我們所需要的, 所以呢, 我們修改它即可, 另外呢, 如果Bundled (Maven 3) 不能滿足需求,我們可以另外下載一個 apache-maven 可執行程序
然后指定它即可。 比如我的 D:/devTool/apache-maven-3.3.9 :
不過呢, 這樣做好像沒有什么必要! 因為,一般 idea 自帶的maven插件就足夠。
另外, 這里有兩行是什么意思?
我登錄用戶是lk, 所以默認 本地倉庫地址是 C:\Users\lk\.m2\repository ;
User settings file 的出現,導致了 settings.xml 的優先級更加朴素迷離。 因為 User settings file 是在 idea 中可以配置的。
測試發現呢,User settings file 優先級最高,但是User settings file 指定的文件也可以不存在, 如果 那么以maven-home下的配置 為准!
Override 到底怎么用
Override 有點難理解。
Override 表示是可以覆蓋的, 如果勾選了override,那么就可以修改。User settings file 是可以隨意指定的。
這里的 User settings file 的優先級其實是最高的。高於 maven下的配置:比如 maven-home\conf\settings.xml, 也就是覆蓋的作用。
本地倉庫的地址呢, 還可以通過Local repository 進行設置,這個優先級更好,可以覆蓋User settings file 中的localRepository