2014-04-02 2 views
0

메서드에 전달 된 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 어떻게 하위 클래스 로더에서로드 할 수 있습니까?

답변

1

동일한 자바 프로그램에서 여러 개의 jdbc 드라이버를 가질 수 있지만 그다지 잘못은 없습니다. 대신 ClassLoader.getResourceUrls() (일치하는 모든 URL을 표시)을 시도 했습니까? 그러면 원하는 것을 찾을 수 있습니다.

또는 META-INF 파일은 실제로 ServiceLoader 메커니즘의 일부이므로 해당 클래스를 사용하는 것이 더 나을 것입니다.

마지막으로 jdbc 드라이버를 사용하려는 경우이 작업을 수행 할 필요가 없습니다. 올바른 URL로 드라이버를 생성하면 jdbc 프레임 워크가 이미 클래스 경로에있는 경우 올바른 드라이버를 자동으로 찾습니다.

UPDATE :

의도가 원하지 않는 모든 종류의 것들을 할 것 같은 다음 클래스 로더를 사용하지 않아야하는 특정 jar 파일을 검사하는 경우

. 단지 JarFile을 사용하여 항아리를 검사하고 원하는 정보를 추출하십시오.

+0

사용자가 특정 드라이버에 대해 jar 파일을 선택할 가능성이있는 이클립스 용 마법사를 만들고 마법사가 드라이버에 적합한 클래스를 선택해야합니다. 현재 마법사는이 클래스 이름에 대한 사용자 입력을 예상하며 정상적으로 작동합니다. 그러나 나는 그것을 향상시키고 싶다. ServiceLoader 사용을 고려합니다. –

+0

@ DanyloEsterman - 내 대답 업데이트 – jtahlborn

+0

고마워요! '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());'내 해결책입니다! –

관련 문제