运行可执行jar时ClassNotFoundException

时间:2014-04-04 18:25:40

标签: java maven jar noclassdeffounderror

我为实用程序文件创建了一个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>

2 个答案:

答案 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