2012-11-23 61 views
5

在Java應用程序中,我嘗試使用的newInstance()在類方法來創建類的Class1 的實例。 1類是屬於我的項目,但它也需要Class2中這是從另一個項目和位於中,我已經添加到項目,並在Eclipse中構建路徑的外部JAR。 Eclipse似乎發現了Class2,因爲它編譯項目時沒有任何問題,但是當我嘗試獲取Class1的實例時,它會拋出關於Class2的ClassNotFoundException的ClassNotFoundException在運行,但應用程序編譯

這是1類的樣子:

import other.package.Class2; 

public class Class1 implements Class1Interface{ 
    //there's no explicit constructor 

    @Override 
    public void method1(String param){ 
     System.out.println("Loading....."); 
    } 

    @Override 
    public void notifyChanges(String param) throws Exception{ 
     Class2 class2 = Class2.getInstance(); //here it's used the Class2 from another jar 
     ... 
    } 
} 

,這是我如何努力得到它的實例:

String myParam = "blabla"; 
Class1Interface interf = "my.package.Class1"; 
try { 
    interf = (Class1Interface) Class.forName(interfazws).newInstance(); 
    interf.method1(myParam); 
} catch (InstantiationException e) { 
    handle(e); 
} catch (IllegalAccessException e) { 
    handle(e); 
} catch (ClassNotFoundException e) { 
    handle(e); 
} 

當我執行,我得到:

Caused by: org.springframework.scheduling.quartz.JobMethodInvocationFailedException: Invocation of method 'execute' on target class [class my.package.myJobJob] failed; nested exception is java.lang.NoClassDefFoundError: other/package/Class2    
... 
Caused by: java.lang.NoClassDefFoundError: other/package/Class2 
... 
Caused by: java.lang.ClassNotFoundException: other.package.Class2 

關於我的項目配置的另一件事是,在WEB-INF文件夾下我有一個名爲libs的文件夾,其中包含一些ja rs和我創建了另一個名爲libs_other_company的lib文件夾,並且我在那裏放置了Class2所在的jar。如果我轉到java構建路徑,可以看到添加到庫選項卡中的jar。

我在Tomcat服務器直接從Eclipse中運行的應用程序(我不喜歡使用Ant或Maven的任何東西)。

它怎麼可能在編譯時找到這個類,而不是在運行時呢?任何想法,使其工作?

謝謝。

+0

它看起來應該已經在這裏解決了。雖然沒有檢查過。 –

回答

4

您混淆了兩個單獨的東西,編譯時間類路徑解析和運行時類路徑訪問。

  1. 當你編譯您的應用程序,你需要有一個應用程序使用的類/是指在開發環境中編譯的類路徑;如果你不這樣做(那樣做),那麼會發生編譯時錯誤。

  2. 當你運行已編譯應用程序,你需要有一個應用程序使用/指的是在你的JVM類路徑或包括在應用程序包中的所有類;如果你不這樣做(那樣做),那麼會發生運行時錯誤。

您會遇到第二個。

+2

我知道這是問題所在。我不明白爲什麼eclipse沒有把jar放到運行時環境中。 – Javi

+1

因爲默認情況下它不這樣做,所以你必須「告訴」它包含哪些類/ jar,否則每個應用程序將不得不包含(幾乎)所有的類。只有**你**會知道你打算運行你的應用程序的環境是什麼。爲此,我更願意使用ant構建文件來打包應用程序。 –

+0

那麼有沒有什麼辦法可以在Eclipse中配置它,或者我必須爲此構建一個Ant腳本? – Javi

相關問題