我創建了一個應用程序,用於自動下載天氣數據並將這些數據添加到數據庫的特定位置。此應用程序按照預期在IntelliJ內工作NoClassDefFoundError在Linux上運行應用程序(但不是在Mac上)
現在我想將此應用程序作爲獨立應用程序運行。因此,我使用maven創建了一個jar。該jar是一個「精益」罐子,沒有任何依賴關係。依賴關係輸出到目錄lib
。該Maven插件配置爲:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>nl.wur.fbr.data.weather.WeatherData</mainClass>
</manifest>
</archive>
<outputDirectory>${project.build.directory}/WeatherData</outputDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/WeatherData/lib</outputDirectory>
<overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
類路徑添加到清單(我檢查)和所有相關性輸出到lib目錄。
當我在我的Mac(Java版本1.8.0)上運行此應用程序時,一切正常。但是,當我在Linux服務器上運行它(壓縮和解壓,並運行Java 1.8.0之後),我收到以下錯誤:
$ java -jar weatherData-1.0-SNAPSHOT.jar
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: nl/wur/fbr/om/factory/InstanceFactory
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: nl.wur.fbr.om.factory.InstanceFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 more
典型的類路徑問題,但爲什麼會表現不同MacOSX上和在Linux上?主jar文件(包含classpath的清單)和lib目錄都是相同的。
對我來說,它看起來並不像你在你的maven依賴中有'nl.wur.fbr.om.factory.InstanceFactory'。也許你在mac上手動添加它? – XtremeBaumer
考慮使用'maven-shade-plugin'來構建「完整」JAR。這通常是一個更好的選擇。 – lexicore
@XtremeBaumer包含該庫的jar文件位於lib目錄中。我從來沒有手動添加到我的Mac。這當然是在我的Maven倉庫中。但是在運行獨立應用程序時,我不使用maven。 –