2016-12-05 231 views
-1

我創建了一個應用程序,用於自動下載天氣數據並將這些數據添加到數據庫的特定位置。此應用程序按照預期在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目錄都是相同的。

+0

對我來說,它看起來並不像你在你的maven依賴中有'nl.wur.fbr.om.factory.InstanceFactory'。也許你在mac上手動添加它? – XtremeBaumer

+0

考慮使用'maven-shade-plugin'來構建「完整」JAR。這通常是一個更好的選擇。 – lexicore

+0

@XtremeBaumer包含該庫的jar文件位於lib目錄中。我從來沒有手動添加到我的Mac。這當然是在我的Maven倉庫中。但是在運行獨立應用程序時,我不使用maven。 –

回答

1
I am not sure what is exactly causing this issue but below steps might help to narrow down the path. 

Step 1 : Verify the class file nl.wur.fbr.om.factory.InstanceFactory present inside jar 

Step 2: Verify MANIFEST.MF file and check for the following entries - 
ex: Main-Class: nl.wur.fbr.data.weather.WeatherData 
Class-Path: 
    ../config/ 
    classes12.jar 
    bc4jct.jar 
    bc4jdomorcl.jar 
    bc4jmt.jar 
    commons-beanutils-bean-collections.jar 
    commons-beanutils-core.jar 

Step 3 : Verify the jar entry is present in Class-Path 

Step 4: If the issue still persists, try running with java -classpath option. 
+0

我試過你的步驟,現在它似乎是OM庫中的一個問題。顯然,包含'InstanceFactory'的庫是'lib/om-java-model-0.6.0-SNAPSHOT.jar',而在清單中則是庫lib/OM-java-model-0.6.0-SNAPSHOT。 jar'。注意大小寫。爲什麼在圖書館不包含首都的情況下,maven會使用大寫字母來寫清單? –

+0

這是問題所在。在OM圖書館(也在我的控制下),大寫字母混在一起。我已經在該庫中編輯了pom文件,現在參考文件已正確設置。 –

相關問題