還是記錄使用 maven 時遇到的問題。
一、maven報錯
maven package 進行打包時出現了以下報錯:
Non-resolvable parent POM for com.wpbxin:springboot2-first-example:0.0.1-SNAPSHOT: Could not transfer artifact org.springframework.boot:spring-boot-starter-parent:pom:2.1.5.RELEASE from/to alimaven (https://maven.aliyun.com/nexus/content/groups/public): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target and 'parent.relativePath' points at wrong local POM @ line 10, column 13 -> [Help 2]
截圖如下:
再來一個一樣但是比較奇葩的截圖,這一次基本是處理完本次出現的問題后,筆者想回過頭來重現問題然后記錄下來(前后間隔3天左右),但卻發現,同個打包的 maven 命令,前面還打包不成功,隔了十幾秒再次運行命令,卻又打包成功了(還有真可能是渣渣的網絡原因!畢竟我這里用了手機的熱點),一次 package 成功了然后后面的打包又基本沒問題了,呃。。。
二、一些說明
這個是學習 SpringBoot2 時創建 HelloWorld 工程遇到的問題。先說下相關環境和系統設置:
win10 + JDK 1.8.0_111 + Apache Maven 3.3.9 + idea2019.1( + 手機共享熱點,不排除可能網絡問題下載慢)( + 谷歌瀏覽器77版本的)
筆者回過頭記錄這篇文章的時候試了下,默認情況下的maven中央倉庫地址:https://repo.maven.apache.org/maven2(好像比用阿里雲的鏡像庫時順利點,速度也感覺還行吧。)。這里貼上本地 maven 的 mirror 設置,這里設置的是國內的阿里雲鏡像,詳情可以參考阿里雲公共代理庫官網相關說明:https://help.aliyun.com/document_detail/102512.html?spm=a2c40.aliyun_maven_repo.0.0.36183054oSYFKS。
<mirror> <id>alimaven</id> <name>aliyun maven</name> <mirrorOf>central</mirrorOf> <!-- 阿里雲公共代理庫使用指南:https://help.aliyun.com/document_detail/102512.html?spm=a2c40.aliyun_maven_repo.0.0.36183054oSYFKS --> <!-- <url>https://maven.aliyun.com/nexus/content/groups/public</url> --> <url>https://maven.aliyun.com/repository/public</url> </mirror>
三、出現問題的原因和幾種解決方法
看了下報錯提示,然后在網上搜了下,大致可以看出是 HTTPS 的證書安全檢查問題。想想也是,現在 HTTPS 在大力推廣,而 HTTPS 確實是需要雙向驗證的。既然遇到了,那總得處理完然后記錄下吧,免得再被坑。以下就是筆者關於處理這個問題過程中的一些參考和驗證。以下是4種處理方式:
1、忽略SSL證書檢查
直接忽略掉SSL證書檢查,跳過這個驗證,在 maven 打包命令中加上參數 “-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true” 。
idea中的設置: settings ==> Build,Execution,Deployment ==> Build Tools ==> Maven ==> Runner 中的 VM Options ,將參數填入,截圖如下:
Eclipse中的設置:右鍵項目 ==> Run As ==> Run Configurations... ,在 Maven Build 那一塊中的 JRE 欄位中的 VM arguments ,將參數填入,注意這里不同的參數需要換行,截圖如下:
參考鏈接:使用Maven時出現“jssecacerts PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilde”錯:https://blog.csdn.net/carrie__yang/article/details/79612385
2、生成證書並導入到 JRE security 中
既然用的是阿里雲的鏡像,那就去官網下個證書瞧一瞧。
第一步,谷歌瀏覽器打開網站:https://maven.aliyun.com/mvn/view,左上角中那把小鎖,也即截圖的紅框,
點擊“證書(有效)”,舊版的瀏覽器可以有 View certificate 之類的,反正記住是看證書就行。
彈出來一個框框,點擊“詳細信息”
選擇“復制到文件(C)...”,然后下一步
選擇格式:
生成的名稱,比如我這里aliyun-maven.cer,路徑是 C:\cs-softwares\aliyun-maven.cer ,然后導出來:
完成證書導出
接下來,使用 keytool 命令導入證書,進入到 JDK 下 jre 下 lib 下的 security 目錄,比如我的是 C:\cs-softwares\Java\jdk1.8.0_111\jre\lib\security,然后運行命令 keytool -import -alias aliyun-maven -keystore cacerts -file C:\cs-softwares\aliyun-maven.cer ,如下,證書指紋(證書密鑰):changeit
-alias :表示指定證書別名
-file :指定證書文件
輸入 Y 表示確認:
查看證書,證書密鑰同樣是 changeit :
keytool -list -keystore cacerts -alias aliyun-maven
刪除證書,證書密鑰同樣是 changeit:
keytool -delete -alias aliyun-maven -keystore cacerts
確認安裝了證書之后,記得關閉這個cmd窗口,然后重啟下idea或者Eclipse,再次進行 maven packge ,到這里應該是OK了。如果還是不行,報出了錯誤: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty ,如截圖:
來來來,再加上參數(記得路徑可以改為自己的 JDK 安裝路徑),把剛才的證書用上,參考:The trustAnchors Parameter Must Be Non Empty:https://www.techpaste.com/2017/03/trustanchors-parameter-must-non-empty/ ,這下應該妥妥了。(后面OK了之后,也試過刪除了阿里雲鏡像的證書,然后再打包,一樣沒問題,這里可以先試下直接加參數,有問題再加證書)
-Djavax.net.ssl.trustStore=C:\cs-softwares\Java\jdk1.8.0_111\jre\lib\security\cacerts
-Djavax.net.ssl.trustAnchors=C:\cs-softwares\Java\jdk1.8.0_111\jre\lib\security\cacerts
3、使用默認的 maven 中央倉庫
前面提到過默認的 maven 中央倉庫: https://repo.maven.apache.org/maven2,使用默認的配置就行了(本地倉庫自行設置)。
PS:吐槽下,絕望之后回到了最初的起點,使用默認的配置居然沒啥問題(即使用了 maven 默認的中央倉庫,本來是要來重現問題的),然后回過頭來想用阿里雲 maven 鏡像重現問題,就把阿里雲中央倉庫的證書也刪除了,而且使用了阿里雲的鏡像庫,也不加任何參數,這次卻順利用上了,然后把 spring-boot-starter-parent 從 2.1.0.RELEASE 到 2.1.9.RELEASE 都試了個遍,哎呦去咋情況,又都沒問題了,或者是有問題的,試了第二遍或者第三遍又行了,這還真有可能是我的渣渣網絡原因。。。
4、使用 http 的鏡像庫
這就是直接避開了吧,這個方法就沒試過了,只是查找問題的過程中看 stackoverflow 上有提到。
四、參考鏈接
1、使用Maven時出現“jssecacerts PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilde”錯:https://blog.csdn.net/carrie__yang/article/details/79612385
2、徹底解決unable to find valid certification path to requested target:https://blog.csdn.net/gabriel576282253/article/details/81531746
3、關於gradle Cause: unable to find valid certification path to requested target錯誤解決方法:https://www.chengbinbin.cn/archives/1550795296099/
4、Maven編譯打包時報“PKIX path building failed”異常解決方法:https://www.iteye.com/blog/truth99-2160540
5、Problems using Maven and SSL behind proxy:https://stackoverflow.com/questions/25911623/problems-using-maven-and-ssl-behind-proxy
6、Could not transfer artifact from/to central because of InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty:https://stackoverflow.com/questions/37278306/could-not-transfer-artifact-from-to-central-because-of-invalidalgorithmparameter
7、The trustAnchors Parameter Must Be Non Empty:https://www.techpaste.com/2017/03/trustanchors-parameter-must-non-empty/
8、Could not transfer artifact (https://repo.maven.apache.org/maven2): Received fatal alert: protocol_version -> [Help 1]:https://stackoverflow.com/questions/50946420/could-not-transfer-artifact-https-repo-maven-apache-org-maven2-received-fat