2012-09-12 75 views
0

我想使用URLClassLoader從jar-archive加載特定目錄中的類。URLClassLoader找不到類

這個項目的結構如下

/ 
application.jar 
/lib/ 
    mysql.jar 
    log4j.jar 
    ... 
/myClasses/ 
    class1.class 
    class2.class 
    ... 

罐子有以下表現:

Manifest-Version: 1.0 
Ant-Version: Apache Ant 1.8.3 
Created-By: 1.7.0_07-b10 (Oracle Corporation) 
Main-Class: de.application.start 
Class-Path: lib/mysql.jar lib/log4j.jar lib/....jar 

我目前做的是遍歷所有文件內/myClasses/並試圖加載特定的類(他們都有相同的包裝)像這樣:

File classDir = new File("/path/to/my/root/folder/myClasses/"); 
URL[] url = { classdir.toURI().toURL() }; 
ClassLoader loader = new URLClassLoader(url); 
for (File file : classDir.listFiles()) { 
    String filename = StringUtil.getFilenameWithoutExtension(file.getName()); 
    loader.loadClass("de.myClasses." + filename).getConstructor().newInstance(); 

但是,即使這些文件顯然存在,我總是會得到一個java.lang.ClassNotFoundException: de.myClasses.class1錯誤。我究竟做錯了什麼?

+0

你可以編寫你想從jar壓縮包中加載類的tjat,但是在你的代碼中,你將原始目錄(「/ path/to/my/root/folder/myClasses /」)作爲URLClassLoader的參數。你必須在這裏指定jar文件。 – korifey

+0

是的,這是正確的。我的應用程序駐留在一個jar文件中,並且在該存檔之外我想在目錄中加載其他類 –

+0

您的目標是訪問存儲在存儲在jar中的jar中的類嗎?這是行不通的,我相信搜索會出現很多帖子,告訴你爲什麼以及如何解決它。 – parsifal

回答

0

你應該根據它的包把你編譯的類放在目錄中。 因此,de.myClasses.Class1類應位於目錄/myClasses/de/myClasses/

0

file.getName()返回"Class1.class"而不是"Class1",對吧?刪除最後6個字符。

而且,如果1類是在包de.myClasses它應該是在

<your_base_dir>/de/myClasses 

,如果Class1的是在頂部包(不包),那麼你應該要求它作爲

loader.loadClass("Class1") // no de.mClasses. prefix 
+0

不,我在我的申請中已經這樣做了。爲了節省空間,我在這裏寫了它,我會改變它。 –

+0

增加了其他想法... – helios