2012-09-12 82 views
1

我正在嘗試從classLoader的jar文件中加載類。這裏是我的代碼:從jar文件中加載類時發生java.lang.ClassNotFoundException

private void loadJar(String path, String className) { 

    try { 

     File file = new File(path); 

     if (!(file.exists())) { 
      log.error("JAR File not found!"); 
      return; 
     } 

     String anUrl = "jar:file://" + file.getAbsolutePath() + "!/"; 
     URL[] urls = { new URL(anUrl)}; 
     URLClassLoader classLoader = new URLClassLoader(urls); 

     System.out.println("className: "+className); 
     Class aClass = classLoader.loadClass(className); 

     if (!(isNullaryConstructor(aClass))) { 
      System.out.println("Non nullary Constructor detected!"); 
      return; 
     } 

     Object anInstantiation = aClass.newInstance(); 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } 
} 

我在一個帶有主類的測試工作區中試過它。它的工作原理。

但是,當我將它集成到我的項目中。我獲得了此錯誤:

java.lang.ClassNotFoundException 

我正在使用Maven。我必須在依賴中添加一些東西嗎?

我列出了出現在我的jar文件中的類,以驗證的className與此代碼正確:

public static void main(String[] args) throws Exception { 

    JarFile jf = new JarFile(new File(jarPath)); 

    Enumeration<JarEntry> e = jf.entries(); 
    while (e.hasMoreElements()) { 
        JarEntry entry = e.nextElement(); 
     System.out.println(entry.toString()); 
    } 
    jf.close(); 
} 

我輸入的名稱是正確的。

任何幫助,請!

謝謝:)

回答

0
  1. 的URL可能是錯誤的。改爲嘗試file.toURI().toURL()。或者刪除!/;標準的Java類加載器不支持這種語法。

  2. 該類的名稱可能是錯誤的。確保使用完全限定名稱(即包名稱),以..class擴展名分隔的元素。對於String,您可以使用java.lang.String

相關問題