在使用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