描述 分析 lib包下有這個介面從屬的jar包 讀到這裡先不要往下看,想下為何會報找不到類呢? 在打包時會同時生成一個MANIFEST.MF文件,描述了jar包的基本信息 Main Class 指定程式的入口,可以用java jar .jar 來啟動 Class Path 指定jar包依賴關係,類加 ...
描述
我們修改介面時,習慣發佈一個快照版本用於測試。我們的一個服務也是發佈了快照版本,然後一個jar程式要依賴這個服務,修改pom文件打包部署後,通過 java -jar 命令執行這個jar程式,然後你懂的啟動後報錯了
Exception in thread "main" java.lang.NoClassDefFoundError
...
Caused by: java.lang.ClassNotFoundException: ...
分析
lib包下有這個介面從屬的jar包
讀到這裡先不要往下看,想下為何會報找不到類呢?
在打包時會同時生成一個MANIFEST.MF文件,描述了jar包的基本信息
Main-Class 指定程式的入口,可以用java -jar *.jar 來啟動
Class-Path 指定jar包依賴關係,類載入器會根據該路徑來載入class
好的,我們瞭解了MANIFEST.MF文件,那麼我們看下這個文件,可能有的讀者還不清楚怎麼找這個文件,解壓你程式的jar就行,unzip *.jar 就可以看到了
看到Class-Path中報錯的類在我用紅框圈起的jar包中,可以發現這個jar包的名字和我們的lib包中對應的jar名字並不一樣
lib包中是dspadinfo.client-0.0.41-SNAPSHOT.jar
而在MANIFEST.MF文件中是dspadinfo.client-0.0.41-20190902.070402-1.jar,是一個帶有時間戳的形式,說明給Snapshot Version 這種快照版本的jar打包時用了唯一版本,這個是預設的,名字對不上,所以載入不到對應的類,報了上面的錯
解決
maven官方文檔中有對處理快照版本的介紹,連接http://maven.apache.org/shared/maven-archiver/examples/classpath.html
要想強制使用 '-SNAPSHOT'的版本命名,只需要把
<useUniqueVersions>false</useUniqueVersions>
給大家我的項目中的配置,作為參考
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>*.dsp.redispositive.Application</mainClass>
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>
修改完pom文件後,重新打包部署後,MANIFEST.MF文件中的Class-Path中的jar包就是 dspadinfo.client-0.0.41-SNAPSHOT.jar 執行沒有問題
希望你遇到類似的問題,可以想到這個解決辦法