簡體   English   中英

運行可執行jar時ClassNotFoundException

[英]ClassNotFoundException when running executable jar

我為實用程序文件創建了一個jar文件,並將其添加為我的主項目的依賴項。 當我運行mvn install來構建我的主項目時,在我的單元測試中使用了正確的實用程序jar。

但是,當我稍后使用java -jar supervisor.jar運行主項目jar時,我得到一個java.lang.NoClassDefFoundError:java.lang.ClassNotFoundException: com.seeq.utilities.process.OperatingSystem引起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>

如果找不到的類在jar中,則必須提供classpath參數; 例如:

java -cp a.jar -jar supervisor.jar

如果您想將jar及其依賴項打包到一個可執行的uber jar中,請考慮使用maven shade插件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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM