草率了,又一個(gè)Maven打包的問(wèn)題
經(jīng)常遇到 Maven 相關(guān)的問(wèn)題,這是之前的文章:
這個(gè) Maven 依賴的問(wèn)題,你敢說(shuō)你沒(méi)遇到過(guò):https://mp.weixin.qq.com/s/SzBbDtyRUrk_7LH8SUbGXQ Maven 快照版本要這樣用才真的香?。?a style="font-weight: bold;color: rgb(239, 112, 96);border-bottom: 1px solid rgb(239, 112, 96);" data-linktype="2">https://mp.weixin.qq.com/s/S0X1qY4uRsAeaqiC80fyNA
今天再來(lái)一個(gè),首先看下錯(cuò)誤信息,一看就很熟悉,都是老朋友了,還是曾經(jīng)那個(gè)味道。
Caused by: java.lang.ClassNotFoundException: net.sf.json.JSONException
? at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
? at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
? at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
? at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
? ... 57 more
依賴的是 aliyun-log,aliyun-log 內(nèi)部依賴了 json-lib,如下:
net.sf.json-lib
json-lib
2.4
jdk15
從依賴上看沒(méi)啥問(wèn)題,然后看服務(wù)器上打包后的 lib 目錄中有沒(méi)有 json-lib 這個(gè) jar 包。看了下確實(shí)有 json-lib-2.4.jar。錯(cuò)誤明確的告訴我們 JSONException 找不到,也就是沒(méi)有加載到 json-lib 的包,這個(gè)時(shí)候需要看下 MANIFEST.MF 文件中 Class-Path 有沒(méi)有設(shè)置 json-lib 的路徑。
看了下,有對(duì)應(yīng)的路徑,值為 json-lib-2.4-jdk15.jar,可以看到,這個(gè)名稱(chēng)跟打包出來(lái)后的不一致,多了 jdk15。
這個(gè)時(shí)候再回過(guò)頭來(lái)看上面的 classifier,里面指定了 jdk15。classifier 通常用于區(qū)分不同 jdk 版本所生成的 jar 包,如果指定了 classifier,那么 jar 就是要加上 classifier 的值才行,也就是 json-lib-2.4-jdk15.jar 是正確的。
現(xiàn)在問(wèn)題很明顯,就是打包時(shí)的問(wèn)題,打包后的 jar 名稱(chēng)應(yīng)該是 json-lib-2.4-jdk15.jar 才對(duì),而現(xiàn)在是 json-lib-2.4.jar,才導(dǎo)致了 ClassNotFoundException。
然后看了下項(xiàng)目的打包方式,還是比較古老的 assembly,里面對(duì)打包的 jar 進(jìn)行了名稱(chēng)的修飾。
${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}
格式已經(jīng)固定死了,classifier 不在格式當(dāng)中,所以打包后的 jar 名稱(chēng)就會(huì)被改掉。解決方式需要將 classifier 也定義在 outputFileNameMapping 中。
但是 classifier 這個(gè)不是每個(gè) jar 都有的,如果直接使用 artifact.classifier 是不行的,沒(méi)有 classifier 的就會(huì)出問(wèn)題,這里需要有個(gè)判斷。然后找了一個(gè)有就拼接,沒(méi)有就不使用的${dashClassifier?},完美解決。
${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
文檔參考:
http://maven.apache.org/plugins/maven-ear-plugin/examples/customize-file-name-mapping.html
關(guān)于作者:尹吉?dú)g,簡(jiǎn)單的技術(shù)愛(ài)好者,《Spring Cloud 微服務(wù)-全棧技術(shù)與案例解析》, 《Spring Cloud 微服務(wù) 入門(mén) 實(shí)戰(zhàn)與進(jìn)階》作者, 公眾號(hào)猿天地發(fā)起人。
我整理了一份很全的學(xué)習(xí)資料,感興趣的可以微信搜索「猿天地」,回復(fù)關(guān)鍵字 「學(xué)習(xí)資料」獲取我整理好了的 Spring Cloud,Spring Cloud Alibaba,Sharding-JDBC 分庫(kù)分表,任務(wù)調(diào)度框架 XXL-JOB,MongoDB,爬蟲(chóng)等相關(guān)資料。
后臺(tái)回復(fù)?學(xué)習(xí)資料?領(lǐng)取學(xué)習(xí)視頻
如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝
