메서드에 전달 된 jar 파일 안의 파일에서 클래스 이름을 읽고 전달 된 StringBuilder에 결정된 클래스 이름을 넣으려고합니다.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
의 동작은 같습니다.
Sow 어떻게 하위 클래스 로더에서로드 할 수 있습니까?
사용자가 특정 드라이버에 대해 jar 파일을 선택할 가능성이있는 이클립스 용 마법사를 만들고 마법사가 드라이버에 적합한 클래스를 선택해야합니다. 현재 마법사는이 클래스 이름에 대한 사용자 입력을 예상하며 정상적으로 작동합니다. 그러나 나는 그것을 향상시키고 싶다. ServiceLoader 사용을 고려합니다. –
@ DanyloEsterman - 내 대답 업데이트 – jtahlborn
고마워요! 'jar = new JarFile (new File (path), false, JarFile.OPEN_READ); br = new BufferedReader (새로운 InputStreamReader (jar.getInputStream (jar.getJarEntry ("META-INF/services/java.sql.Driver")))); classNameBuilder.append (br.readLine());'내 해결책입니다! –