我想從傳遞給該方法的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
具有相同的行爲。
母豬我該如何強制從子類加載器加載?
我正在爲eclipse創建一個嚮導,其中用戶有可能爲特定的驅動程序選擇一個jar文件,嚮導應該爲驅動程序選擇正確的類。目前我的嚮導期望用戶輸入此類名稱,並且它工作正常。但我想改進它。我考慮使用ServiceLoader。 –
@DanyloEsterman - 更新了我的回答 – jtahlborn
非常感謝! '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());'是我的解決方案! –