2014-04-02 43 views
0

我想從傳遞給該方法的jar文件中的文件中讀取類名,並將確定的類名放入傳遞的StringBuilder中。JAR不在classpath上,強制類加載器從它讀取文件

對於驅動程序文件jtds-1.3.1.jar我應該得到net.sourceforge.jtds.jdbc.Driver但我得到sun.jdbc.odbc.JdbcOdbcDriver而不是獨立於傳遞的文件。我想孩子類加載器從/META-INF/services/java.sql.Driver讀取,這是我的類路徑(但我真的不知道在哪裏),我無法弄清楚如何管理這個類加載器的東西。

下面關於這個問題的代碼:

public String determineAndSetDriverClass(File jar, StringBuilder classNameBuilder) 
{ 
    BufferedReader br = null; 
    URLClassLoader child = null; 
    try 
    { 
     URL[] urls = {jar.toURI().toURL()}; 
     child = new URLClassLoader(urls, this.getClass().getClassLoader()); 
     br = new BufferedReader(new InputStreamReader(child.getResourceAsStream("/META-INF/services/java.sql.Driver"))); 
     classNameBuilder.append(br.readLine()); 
     return null; 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     return e.getMessage(); 
    } 
    finally 
    { 
     try 
     { 
      if (br != null) 
       br.close(); 
      if (child != null) 
       child.close(); 
     } 
     catch (IOException ioe) 
     { 
      ioe.printStackTrace(); 
     } 
    } 
} 

javadoc of getResource method:「這種方法將首先搜索資源的父類加載器;」看來getResourceAsAstream具有相同的行爲。

母豬我該如何強制從子類加載器加載?

回答

1

你可以在同一個java程序中有多個jdbc驅動程序,沒有什麼問題。你試過ClassLoader.getResourceUrls()(它會返回所有匹配的url)嗎?那麼你可以找到你想要的。另外,這些META-INF文件真的是ServiceLoader機制的一部分,所以也許你會更好地使用該類。

最後,如果您只是想使用jdbc驅動程序,則不需要執行任何操作。您只需要使用正確的url創建驅動程序,並且如果jdbc框架已位於類路徑中,它將自動找到正確的驅動程序。

UPDATE:

如果您的目的是檢查特定 jar文件,那麼你不應該使用一個ClassLoader,因爲它會做各種你不想要的東西。只需使用JarFile來檢查罐子並提取您所需的信息。

+0

我正在爲eclipse創建一個嚮導,其中用戶有可能爲特定的驅動程序選擇一個jar文件,嚮導應該爲驅動程序選擇正確的類。目前我的嚮導期望用戶輸入此類名稱,並且它工作正常。但我想改進它。我考慮使用ServiceLoader。 –

+0

@DanyloEsterman - 更新了我的回答 – jtahlborn

+0

非常感謝! 'jar = new JarFile(new File(path),false,JarFile.OPEN_READ); (新的InputStreamReader(jar.getInputStream(jar.getJarEntry(「META-INF/services/java.sql.Driver」)))); classNameBuilder.append(br.readLine());'是我的解決方案! –

相關問題