【发布时间】:2016-05-28 12:41:39
【问题描述】:
我使用以下构建配置从 maven 创建了一个可执行 jar:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/${project.build.targetName}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<excludeScope>test</excludeScope>
<includeScope>compile</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<packageName>${project.build.packageName}</packageName>
<mainClass>${project.build.packageName}.${project.build.className}</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
<finalName>${project.build.targetName}/${project.build.targetName}</finalName>
</configuration>
</plugin>
其中生成了以下文件:
./lib/axis-2878297.jar
./lib/axis-wsdl4j-1.5.1.jar
./lib/(other dependencies jars)
./target.jar
1.如果我以这种方式从命令行运行这个jar:
java -jar target.jar
它会产生异常:
Exception in thread "main" java.lang.NoClassDefFoundError: javax/wsdl/OperationType
at org.apache.axis.description.OperationDesc.<clinit>(OperationDesc.java:59)
...
2.如果我以其他方式运行它:
java -cp "target.jar;lib\*" com.test.Main
执行会成功。
P.S.我尝试将 -verbose:class 放入命令中。
对于案例 1,它显示:
[Loaded org.apache.axis.description.OperationDesc from file:/C:/build/lib/axis-2878297.jar]
[Loaded java.lang.Throwable$PrintStreamOrWriter from C:\Program Files\Java\jre1.8.0_74\lib\rt.jar]
[...]
虽然情况 2 显示:
[Loaded org.apache.axis.description.OperationDesc from file:/C:/build/lib/axis-2878297.jar]
[Loaded javax.wsdl.OperationType from file:/C:/build/lib/axis-wsdl4j-1.5.1.jar]
[...]
案例1失败的原因是什么?
谢谢。
【问题讨论】:
-
查看 target.jar 中的 MANIFEST.MF 文件。 Class-Path 行应明确提及您的所有 lib/* 文件,并使用从 target.jar 开始的正确相对路径名。
-
@ThorbjørnRavnAndersen 感谢您的提示。有趣的是,在 MANIFEST.MF 中,lib 下的所有 jar 都包含在 Class-Path 中,除了 axis-wsdl4j-1.5.1.jar。
标签: java maven jar wsdl classpath