2009-10-14 52 views
2

類文件,我有以下代碼:的ClassNotFoundException的類路徑

// Test TODO remove 
    try { 
     System.out.println(System.getProperties().getProperty("java.class.path")); 
     this.getClass().getClassLoader().loadClass("mypackage.MyClass"); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

現在的輸出顯示了我,這個類是在classpath,即:

/...some/path.../workspace/project/target/test-classes:/rest/of/the/classpath 
java.lang.ClassNotFoundException: mypackage.MyClass 
     ...here be stacktrace... 

我還相信,該檔案acutaly是在給定的位置,即這個文件是否存在:

/...some/path.../workspace/project/target/test-classes/mypackage/MyClass.class 

也許下面是importan t:顯示的代碼是在附加到jUnit測試的javaagent中執行的,我以編程方式啓動(通過Runtime.execute(...)) - 因此,可能會出現明顯可能會在後臺出錯的問題...但仍:如果類路徑包含類的文件夾,它怎麼不能被加載?

回答

1

對於所有感興趣的人: 我不知道是什麼問題。

我用它弄了一下,結果發現Runtime.exec(...)執行的命令字符串在shell中執行後效果很好。

我擺弄了一下,但最終放棄尋找「真正」的原因。取而代之的

Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec(command); 

我現在使用Apache高管:

CommandLine commandLine = CommandLine.parse(command); 
DefaultExecutor executor = new DefaultExecutor(); 
int exitValue = executor.execute(commandLine); 

具有完全相同的命令字符串,一下子就炒菜鍋!

0

假設目標字節碼保持在classpath中,相應的類可以被當前類的類加載器加載。但是,如果當前類是由棘手的/錯誤的類加載器加載的,則情況並非如此。

我建議做到以下幾點:

  1. 檢查使用的類加載器:

    System.out.println(this.getClass().getClassLoader()); 
    System.out.println(ClassLoader.getSystemClassLoader() == this.getClass().getClassLoader()); 
    this.getClass().getClassLoader().loadClass("mypackage.MyClass"); 
    
  2. 提供說明該問題

最小的,但完全可重複的測試案例
+0

您好! 感謝您的意見,輸出: [email protected] true 和一個ClassLoader.getSystemClassLoader()。loadClass(「mypackage.MyClass」); 也沒有幫助... 但無論如何。如果沒有其他的幫助,我將不得不選擇測試案例......由於涉及的努力,我避免了這種情況。 – roesslerj 2009-10-14 12:44:36

4

Java代理程序在啓動JVM的早期加載(出於顯而易見的原因)並且擁有自己的「classpath」,所以它不是由(歷史上命名的)系統類加載器加載的。這就是爲什麼你有一個'jarpath'作爲命令行參數的一部分。

因此,您將需要像System.getSystemClassLoader,URLClassLoader.newInstance(與java.class.path)或Thread.getContextClassLoader取決於您的情況。

+0

這種直觀而漫無目的的理解!謝謝,我會調查這個方向並說明結果...... – roesslerj 2009-10-14 12:46:39

相關問題