草率了,又一個Maven打包的問題
經(jīng)常遇到 Maven 相關(guān)的問題,這是之前的文章:
這個 Maven 依賴的問題,你敢說你沒遇到過: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
今天再來一個,首先看下錯誤信息,一看就很熟悉,都是老朋友了,還是曾經(jīng)那個味道。
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
從依賴上看沒啥問題,然后看服務(wù)器上打包后的 lib 目錄中有沒有 json-lib 這個 jar 包??戳讼麓_實有 json-lib-2.4.jar。錯誤明確的告訴我們 JSONException 找不到,也就是沒有加載到 json-lib 的包,這個時候需要看下 MANIFEST.MF 文件中 Class-Path 有沒有設(shè)置 json-lib 的路徑。
看了下,有對應(yīng)的路徑,值為 json-lib-2.4-jdk15.jar,可以看到,這個名稱跟打包出來后的不一致,多了 jdk15。
這個時候再回過頭來看上面的 classifier,里面指定了 jdk15。classifier 通常用于區(qū)分不同 jdk 版本所生成的 jar 包,如果指定了 classifier,那么 jar 就是要加上 classifier 的值才行,也就是 json-lib-2.4-jdk15.jar 是正確的。
現(xiàn)在問題很明顯,就是打包時的問題,打包后的 jar 名稱應(yīng)該是 json-lib-2.4-jdk15.jar 才對,而現(xiàn)在是 json-lib-2.4.jar,才導(dǎo)致了 ClassNotFoundException。
然后看了下項目的打包方式,還是比較古老的 assembly,里面對打包的 jar 進(jìn)行了名稱的修飾。
${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}
格式已經(jīng)固定死了,classifier 不在格式當(dāng)中,所以打包后的 jar 名稱就會被改掉。解決方式需要將 classifier 也定義在 outputFileNameMapping 中。
但是 classifier 這個不是每個 jar 都有的,如果直接使用 artifact.classifier 是不行的,沒有 classifier 的就會出問題,這里需要有個判斷。然后找了一個有就拼接,沒有就不使用的${dashClassifier?},完美解決。
${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
文檔參考:
http://maven.apache.org/plugins/maven-ear-plugin/examples/customize-file-name-mapping.html
關(guān)于作者:尹吉歡,簡單的技術(shù)愛好者,《Spring Cloud 微服務(wù)-全棧技術(shù)與案例解析》, 《Spring Cloud 微服務(wù) 入門 實戰(zhàn)與進(jìn)階》作者, 公眾號猿天地發(fā)起人。
