在使用dubbo 時,基本都需要通過maven-jar-plugin來生成jar包文件,其中內容包括
META-INF/MAINIFEST.MF程序主文件
文件里有一個屬性用來指定classpath 的,叫 Class-Path
maven-jar-plugin會將所有maven依賴放到這里來
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Build-Jdk: 1.8.0_91
Main-Class: com.alibaba.dubbo.container.Main
Built-Time: 2018-01-16T08:15:14Z
XXXX: 1
Class-Path: . lib/cn-jufuns-ien-api-1.0.0.jar lib/zkclient-0.1.jar lib
/zookeeper-3.4.6.jar lib/jline-0.9.94.jar
但唯獨是那些 獨立jar包的maven依賴沒有加進來:
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-signature</artifactId>
<version>0.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/lib/alipay-sdk-jar.jar</systemPath>
</dependency>
例如做支付寶開發的時候需要用到的alipay-sdk.java.jar ,
因為沒有放到maven 倉庫所以不會寫入到MAINIFEST.MF文件里的Class-Path。
解決方法一
將jar文件放到 maven 私庫里,然后就可以不用使用<scope>syetem</scope>來觸發這個bug
解決方法二
在maven-jar-plugin 里配置Class-Path,
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<!-- 生成的jar中,不要包含pom.xml和pom.properties這兩個文件 -->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<mainClass>com.alibaba.dubbo.container.Main</mainClass>
<useUniqueVersions>false</useUniqueVersions>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<manifestEntries>
<Class-Path>. lib/alipay-sdk.java.jar</Class-Path>
<XXXX>111</XXXX>
</manifestEntries>
</archive>
</configuration>
</plugin>
請留意這個區域的配置,將本地jiar文件寫入Class-Path:
<manifestEntries>
<Class-Path>. lib/alipay-sdk.java.jar</Class-Path>
</manifestEntries>
配置了這個以后,maven-jar-plugin 會將其他maven 依賴的jar文件在這個基礎上追加。
詳細manifestEntries配置可以參考:
http://maven.apache.org/shared/maven-archiver/examples/manifestEntries.html