![](/img/trans.png)
[英]Issue while running executable jar : ClassNotFoundException coming
[英]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.