2011-10-24 6 views
2

jar 파일에서 클래스를 동적으로로드하려고합니다. 우분투 리눅스 박스 (Sun Java 버전 1.6.0_24 (b07))에서 정상적으로 작동했습니다.Windows에서 Java 동적 클래스로드가 실패하지만 Linux에서 정상적으로 작동 중입니다.

Windows (Windows 7, Java 버전 "1.6.0_14")에서 같은 것을 실행하려고하면 클래스 없음 .

try { 
     String jarFile = "/sqljdbc4.jar"; 
     File newf = new File(jarFile); 
     System.out.println(newf.getAbsolutePath()); 
     System.out.println("File exists ? :" + newf.exists()); 
     String urlPath = "jar:file://" + newf.getAbsolutePath() + "!/"; 
     System.out.println(urlPath); 
     ClassLoader cur = Thread.currentThread().getContextClassLoader(); 

     URL[] jarUrlArray = { new URL(urlPath) }; 
     URLClassLoader cl = URLClassLoader.newInstance(jarUrlArray, cur); 

     Class c = Class.forName(
       "com.microsoft.sqlserver.jdbc.SQLServerDriver", true, cl); 
     Method m[] = c.getMethods(); 
     for (Method mm : m) { 
      System.out.println(mm.getName()); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

리눅스에서 실행, 항아리는 루트 및 Windows 용 배치되는 동안 C에서의 : \ (소스 및 바이너리 C에 어떤 폴더에 있습니다 찾을 예외

다음 코드 \ 그래서 " /sqljdbc4.jar "가 Windows에서 c : \ sqljdbc4.jar로 해석되면 두 플랫폼 모두에 대해 올바른 jar 위치가 클래스 로더에 전달되었는지 확인했습니다.

다음 91,363,210는

java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver 
at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:594) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:251) 
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:247) 
at DemoClass.loadAClass(DemoClass.java:31) 
at DemoClass.main(DemoClass.java:14) 

참고에 내가 얻을 스택 추적입니다 : 당신은 u는이 밖으로 시도 할 필요가있는 항아리를 사용할 수 있습니다. 나는 MS SQL Server JDBC 드라이버 jar로 놀고 있었다.

감사합니다.

-bbhijeet.

답변

3

URL을 만들려면이 사용하기보다는 수동으로 문자열을 구축하십시오 :

URL[] jarUrlArray = { newf.toURI().toURL() }; 
+0

덕분에 많이 bkail을! 그것은 일했다 –

+0

나는 하루 종일 이것으로 고투하고있다. URLClassLoader 확장하기. 다른 많은 Stackoverflow 질문에이 문제가 있습니다. 특히 URLClassLoader 관련. @bkail에게 많은 감사를드립니다. – Koekiebox