遇到的問題
Maven 錯誤:was cached in the local repository, resolution will not be reattempted until the update
在使用公司內(nèi)部的 maven 倉庫編譯項目時,由于新加入了幾個依賴包,第一次編譯失敗了,可能原因是 maven 私服找不到相關(guān)jar。此后在修復(fù)了公司內(nèi)部 maven 倉庫后編譯項目出現(xiàn)錯誤
方法一:查看本地倉庫對應(yīng) jar 包所在目錄的 lastUpdated 文件,進一步查看報錯信息,嘗試刪除后再次運行原 maven 命令或進行代碼的拉取。
方法二:在repository 的 release或者 snapshots 版本中新增 updatePolicy 屬性,設(shè)置為”always”、”daily” (默認)、”interval:XXX” (分鐘)或”never”。這里設(shè)置為 always,表示強制每次都更新依賴庫。
方法三:maven命令后加-U,如mvn package -U【推薦】
單元測試編寫好, 但是不執(zhí)行
根據(jù)約定優(yōu)于配置。在默認情況下,“maven-surefire-plugin”插件將自動執(zhí)行項目“src/test/java”路徑下的測試類,但測試類需要遵從以下命名模式,Maven才能自動執(zhí)行它們:
Test*.java :以 Test 開頭的 Java 類;
*Test.java :以 Test 結(jié)尾的 Java 類;
*TestCase.java:以 TestCase 結(jié)尾的 Java 類。
Maven 3.8.1 報錯 Blocked mirror for repositories
[ERROR] Failed to execute goal on project test: Could not resolve dependencies for project xxx: Failed to collect dependencies at my.test:dependency:version -> my.test.transitive:transitive:version: Failed to read artifact descriptor for my.test.transitive:transitive:jar:version: Could not transfer artifact my.test.transitive:transitive:pom:version from/to maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories: [blocked-repository-id (http://blocked.repository.org, default, releases+snapshots)]
解決辦法有:
- 將依賴性版本升級到新版本,用 HTTPS 版本替換過時的 HTTP 存儲庫 URL
- 保留依賴版本,但在設(shè)置中定義一個鏡像。
- 注釋掉 $MAVEN_HOME/conf/settings.xml 中的攔截標簽。
使用maven打包失敗,報Unknown lifecycle phase “.test.skip=true“
將命令從
mvn clean package -Dmaven.test.skip=true
改為
mvn clean package '-Dmaven.test.skip=true'
一些記錄
跳過測試用例的執(zhí)行
- -DskipTests,不執(zhí)行測試用例,但編譯測試用例類生成相應(yīng)的 class 文件至 target/test-classes下。
- -Dmaven.test.skip=true,不執(zhí)行測試用例,也不編譯測試用例類。
Maven 的 Snapshot 版本與 Release 版本的區(qū)別
Maven 的 Snapshot 版本與 Release 版本
1、Snapshot 版本代表不穩(wěn)定、尚處于開發(fā)中的版本。
2、Release 版本則代表穩(wěn)定的版本。
3、什么情況下該用 SNAPSHOT?
協(xié)同開發(fā)時,如果 A 依賴構(gòu)件 B,由于 B 會更新,B 應(yīng)該使用 SNAPSHOT 來標識自己。這種做法的必要性可以反證如下:
a. 如果 B 不用 SNAPSHOT,而是每次更新后都使用一個穩(wěn)定的版本,那版本號就會升得太快,每天一升甚至每個小時一升,這就是對版本號的濫用。
b.如果 B 不用 SNAPSHOT, 但一直使用一個單一的 Release 版本號,那當 B 更新后,A 可能并不會接受到更新。因為 A 所使用的 repository 一般不會頻繁更新 release 版本的緩存(即本地 repository),所以B以不換版本號的方式更新后,A在拿B時發(fā)現(xiàn)本地已有這個版本,就不會去遠程 Repository 下載最新的 B
4、 不用 Release 版本,在所有地方都用 SNAPSHOT 版本行不行?
不行。正式環(huán)境中不得使用 snapshot 版本的庫。 比如說,今天你依賴某個 snapshot 版本的第三方庫成功構(gòu)建了自己的應(yīng)用,明天再構(gòu)建時可能就會失敗,因為今晚第三方可能已經(jīng)更新了它的 snapshot 庫。你再次構(gòu)建時,Maven 會去遠程 repository 下載 snapshot 的最新版本,你構(gòu)建時用的庫就是新的 jar 文件了,這時正確性就很難保證了。
【用處不大】從 Maven 項目中導(dǎo)出項目依賴的jar包
一、導(dǎo)出到默認目錄 targed/dependency
從Maven項目中導(dǎo)出項目依賴的jar包:進入工程pom.xml 所在的目錄下,執(zhí)行如下命令:
1、mvn dependency:copy-dependencies,則 maven 項目所依賴的 jar 包會導(dǎo)出到 target/dependency 目錄中。
二、導(dǎo)出到自定義目錄中
在maven項目下創(chuàng)建lib文件夾,輸入以下命令:
1、mvn dependency:copy-dependencies -DoutputDirectory=lib;
2、maven 項目所依賴的 jar 包都會復(fù)制到項目目錄下的lib目錄下。
三、設(shè)置依賴級別
同時可以設(shè)置依賴級別,通常使用 compile 級別
mvn dependency:copy-dependencies -DoutputDirectory=lib -DincludeScope=compile
maven 中配置多個 mirror 的問題
有個小伙伴遇到一個疑問:他的工作筆記本,在公司用部門搭建的maven私服做鏡像,回到家用 aliyun 的鏡像,每次都要改配置文件,很麻煩,希望能夠不改動配置文件的情況下,動態(tài)切換mirror配置。
我們知道 settings.xml 中可以使用變量,可以嘗試使用變量解決。
<mirrors>
<mirror>
<id>aliyun</id>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>${aliyun}</mirrorOf>
</mirror>
<mirror>
<id>netease</id>
<url>http://mirrors.163.com/maven/repository/maven-public/</url>
<mirrorOf>${netease}</mirrorOf>
</mirror>
<mirror>
<id>default</id>
<url>http://192.168.0.100/nexus/repository/maven-public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
我們知道,默認情況下配置多個 mirror 的情況下,只有第一個生效。那么我們可以將最后一個作為默認值,前面配置的使用環(huán)境變量動態(tài)切換。
默認情況下,執(zhí)行: mvn help:effective-settings 可以看到使用的是私服。
如果希望使用阿里云鏡像,如下執(zhí)行:
mvn help-effective-settings -Daliyun=central
同樣的道理,使用網(wǎng)易鏡像,則執(zhí)行:
mvn help:effective-settings -Dnetease=central
maven 在構(gòu)建多模塊項目中,從選擇性的指定位置進行構(gòu)建應(yīng)用
參考 Maven 常用命令 - 構(gòu)建反應(yīng)堆中指定模塊_jason5186 的博客-CSDN博客
https://blog.csdn.net/jason5186/article/details/39530087通過查看 mvn -h命令,可以了解其他命令及其用途;
-am --also-make 同時構(gòu)建所列模塊的依賴模塊;
-amd -also-make-dependents 同時構(gòu)建依賴于所列模塊的模塊;
-pl --projects<arg>構(gòu)建制定的模塊,模塊間用逗號分隔;
-rf -resume-from<arg>從指定的模塊恢復(fù)反應(yīng)堆。
參考
maven 中配置多個 mirror 的問題 - 知乎 https://zhuanlan.zhihu.com/p/69695365