2016-03-28 45 views
0

我有這樣的目錄結構:導入包:異常在線程「主要」 java.lang.NoClassDefFoundError

src 
    MyPackageFile1.java 
    MyPackageFile2.java 
vendor 
    something.jar 
Example.java 

注意src下的所有文件都有一個package com.example;聲明,而Example.java不屬於該包:它是該包的使用示例(因此它有import xyz.pushpad.*;)。

我成功編譯:

javac -classpath vendor/something.jar src/*.java Example.java 

然而,當我運行:

java Example 

我得到:

Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" java.lang.NoClassDefFoundError: com/example/DeliveryException 
    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: com.example.MyPackageFile1 
    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 
+0

引起:java.lang.ClassNotFoundException:com.example.MyPackageFile1 – Shark

回答

1

如果MyPackageFile1.javaMyPackageFile1.java封裝com.example聲明,則存在三個問題:

  1. 你的源代碼目錄結構是錯誤的。應該是這樣的:

    src 
        com 
         example 
         MyPackageFile1.java 
         MyPackageFile2.java 
    
  2. 您正在使用錯誤的類路徑分隔符。由於您使用的是Linux(基於路徑名語法),因此類路徑分隔符是:而不是;

  3. 您用於運行代碼的類路徑是錯誤的。該java命令行應該是這樣的:

    java -cp vendor/something.jar:src:. Example 
    

然而,這一切都非常哈克。

  • 除非你的代碼需要被模塊化爲多個代碼樹,那麼你應該把你的示例源代碼爲src目錄;例如

    src 
        Example.java 
        com 
         example 
         MyPackageFile1.java 
         MyPackageFile2.java 
    
  • 將源代碼和編譯代碼放到同一個樹中是一個壞主意。更好的主意是使用-d選項;例如

    mkdir bin 
    javac -cp bin:vendor/something.jar -d bin 
        src/Example.java 
        src/com/example/MyPackageFile1.java 
        src/com/example/MyPackageFile12java 
    
    java -cp bin:vendor/something.jar Example 
    
  • 您應該使用某種類型的構建工具...如果你想你的構建是一致性和可重複性。

1

類似於編譯命令運行命令也需要罐子檔案路徑上的檔案

java -cp vendor/something.jar;src com.example.Example 

其中Example.java移動到新的目錄src/com/something

相關問題