【问题标题】:Java dynamic class loading fails on windows, but working fine on linuxJava 动态类加载在 Windows 上失败,但在 linux 上工作正常
【发布时间】:2011-10-24 08:00:54
【问题描述】:

我正在尝试从 jar 文件动态加载一个类。它在 Ubuntu linux 机器上运行良好(Sun Java 版本 1.6.0_24 (b07)。

当我尝试在 Windows(Windows 7,Java 版本“1.6.0_14”)上运行相同的东西时,它失败并出现 Class Not Found 异常。

以下是代码:

    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)

注意:您可以使用任何您必须尝试的罐子。我在玩 MS SQL Server JDBC Driver jar。

谢谢!

-阿比吉特。

【问题讨论】:

    标签: class dynamic classloader loading urlclassloader


    【解决方案1】:

    尝试使用它来创建 URL,而不是手动构建字符串:

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

    【讨论】:

    • 我整天都在为此苦苦挣扎。扩展 URLClassLoader。许多其他 Stackoverflow 问题都有这个问题。具体与 URLClassLoader 有关。非常感谢@bkail。
    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 2020-01-30
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    相关资源
    最近更新 更多