咱們修改接口時,習慣發佈一個快照版本用於測試。咱們的一個服務也是發佈了快照版本,而後一個jar程序要依賴這個服務,修改pom文件打包部署後,經過 java -jar 命令執行這個jar程序,而後你懂的啓動後報錯了 Exception in thread "main" java.lang.NoClassDefFoundError ... Caused by: java.lang.ClassNotFoundException: ...
lib包下有這個接口從屬的jar包html
讀到這裏先不要往下看,想下爲什麼會報找不到類呢?java
在打包時會同時生成一個MANIFEST.MF文件,描述了jar包的基本信息redis
Main-Class 指定程序的入口,能夠用java -jar *.jar 來啓動apache
Class-Path 指定jar包依賴關係,類加載器會根據該路徑來加載classmaven
好的,咱們瞭解了MANIFEST.MF文件,那麼咱們看下這個文件,可能有的讀者還不清楚怎麼找這個文件,解壓你程序的jar就行,unzip *.jar 就能夠看到了測試
看到Class-Path中報錯的類在我用紅框圈起的jar包中,能夠發現這個jar包的名字和咱們的lib包中對應的jar名字並不同spa
lib包中是dspadinfo.client-0.0.41-SNAPSHOT.jarcode
而在MANIFEST.MF文件中是dspadinfo.client-0.0.41-20190902.070402-1.jar,是一個帶有時間戳的形式,說明給Snapshot Version 這種快照版本的jar打包時用了惟一版本,這個是默認的,名字對不上,因此加載不到對應的類,報了上面的錯htm
maven官方文檔中有對處理快照版本的介紹,鏈接http://maven.apache.org/shared/maven-archiver/examples/classpath.htmlblog
要想強制使用 '-SNAPSHOT'的版本命名,只須要把<userUniqueVersions>給禁用就行
<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 執行沒有問題
但願你遇到相似的問題,能夠想到這個解決辦法