maven 問題記錄

遇到的問題

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容