Динамическая загрузка классов Java не работает на Windows, но работает нормально на Linux - PullRequest
2 голосов
/ 24 октября 2011

Я пытаюсь загрузить класс динамически из файла 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" преобразуется в c: \ sqljdbc4.jar в windows Я убедился, что правильное расположение 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.

Спасибо!

-Abhijeet.

1 Ответ

4 голосов
/ 26 октября 2011

Попробуйте использовать это для создания URL, а не для построения строки вручную:

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