我正在尝试从 jar 文件动态加载类。它在 Ubuntu Linux 机器上运行良好(Sun Java 版本 1.6.0_24 (b07)。
当我尝试在 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();
}
在 Linux 上运行时,jar 放置在根目录下,对于 Windows 则放置在 c:\(源代码和二进制文件位于 C:\上的某个文件夹中,因此“/sqljdbc4.jar”在 Windows 上解析为 c:\sqljdbc4.jar ,我已确保将正确的 jar 位置传递给两个平台的类加载器。
以下是我在 Windows 上获得的堆栈跟踪
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)
注意:您可以使用任何必须尝试的 jar 。我正在玩 MS SQL Server JDBC 驱动程序 jar。
谢谢!
-阿比 git 。
最佳答案
尝试使用它来创建 URL,而不是手动构建字符串:
URL[] jarUrlArray = { newf.toURI().toURL() };
关于class - Java动态类加载在Windows上失败,但在Linux上工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7872707/