我为实用程序文件创建了一个jar文件,并将其添加为我的主项目的依赖项。当我运行mvn install
来构建我的主项目时,在我的单元测试中使用了正确的实用程序jar。
但是,当我稍后使用java -jar supervisor.jar
运行主项目jar时,我得到java.lang.NoClassDefFoundError:
引起的java.lang.ClassNotFoundException: com.seeq.utilities.process.OperatingSystem
。
在我的单元测试中,使用OperatingSystem
并且测试运行正常,因此我假设在使用java -jar
时使用java时找不到实用程序jar。这是问题,我该如何解决?
Exception in thread "main" java.lang.NoClassDefFoundError: com/seeq/utilities/process/OperatingSystem
at com.seeq.supervisor.util.ProcessManager.buildCommand(ProcessManager.java:78)
at com.seeq.supervisor.util.ProcessManager.<init>(ProcessManager.java:27)
at com.seeq.supervisor.Supervisor.start(Supervisor.java:40)
at com.seeq.supervisor.Main.main(Main.java:21)
Caused by: java.lang.ClassNotFoundException: com.seeq.utilities.process.OperatingSystem
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 4 more
我如何在pom.xml中添加依赖项:
<dependency>
<groupId>com.seeq.utilities</groupId>
<artifactId>seeq-utilities</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/../common/libraries/java/seeq-utilities/target/seeq-utilities-1.0.jar</ systemPath>
</dependency>
答案 0 :(得分:2)
如果找不到的类在jar中,则必须提供classpath参数;例如:
java -cp a.jar -jar supervisor.jar
答案 1 :(得分:0)
如果要将jar及其依赖项打包到一个可执行的 uber jar中,请考虑使用maven shade plugin http://maven.apache.org/plugins/maven-shade-plugin/。可执行的超级jar很方便,因为您可以立即运行它而无需额外的“java -cp”步骤。
可执行uber jar的示例pom插件条目如下所示(另请参阅http://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html)。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.example.MyMainClass/mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
本文还概述了maven shade插件可以执行的操作:http://steveperkins.net/batteries-included-distribution-using-maven-shaded-jars/。
maven shade插件的一个令人讨厌的错误是,如果您多次运行mvn package
,它会发出重复的类警告。从maven-shader-plugin 2.0开始,这个问题仍未得到解决:http://jira.codehaus.org/browse/MSHADE-126)。要解决此问题,您可以在每次调用时从头开始重新创建jar,使用以下maven-jar-plugin配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<forceCreation>true</forceCreation>
</configuration>
</plugin>
您可能遇到的另一个问题是重新打包签名的jar会使其签名无效。如果这会导致错误,请参阅以下答案:https://stackoverflow.com/a/6743609/1454388