URLClassLoader генерирует ClassNotFoundException для некоторых записей - PullRequest
0 голосов
/ 29 мая 2018

Я пишу фрагмент кода, который загружает классы Java из файла JAR, используя URLClassLoader на версии Java v8 u112

Я использую выдержку ниже:

// Create URlClassLoader
Path jarFilePath = Paths.get(...);
URLClassLoader loader = URLClassLoader.newInstance(new URL[] { jarFilePath .toUri().toURL() }, ClassLoader.getSystemClassLoader());

// Filter only .class entries from JAR file since JAR contains *.xml, *.txt etc.
JarFile jarFile = new JarFile(path.toAbsolutePath().toFile()));
List<String> javaClasses = filterJavaClasses(jarFile); // filters only entries with .class extension.

// Attempt class loading. I used the help of BCEL since it converts class to JavaClass which is easier to work with. 
javaClasses.map(clazz -> Repository.lookupClass(loader.loadClass(clazz)))...

Note, the same issue happens even if I don't use BCEL...

При загрузке JARфайл, большинство классов загружаются без проблем, но я сталкиваюсь с проблемой при загрузке некоторых конкретных классов, например com / sun / javadoc / Doclet, com / sun / tools / javadoc / Messager, org / apache / sshd / server /SshServer и т. Д.

кто-нибудь сталкивался с такой проблемой при работе с URLClassLoader?

Пример исключения ниже

java.lang.NoClassDefFoundError: com/sun/javadoc/Doclet
    at java.lang.ClassLoader.defineClass1(Native Method) ~[?:1.8.0_112]
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~[?:1.8.0_112]
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[?:1.8.0_112]
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) ~[?:1.8.0_112]
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73) ~[?:1.8.0_112]
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368) ~[?:1.8.0_112]
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362) ~[?:1.8.0_112]
    at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_112]
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361) ~[?:1.8.0_112]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_112]
    at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:814) ~[?:1.8.0_112]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_112]

1 Ответ

0 голосов
/ 29 мая 2018

Вам нужно не только поместить свои jar-файлы в список URL-адресов, но также и jar-файлы, от которых зависят эти jar-файлы, и их зависимости ...

, например, com / sun / javadoc / Doclet является частью JAVA_HOME /lib / tools.jar, который по умолчанию не загружается systemclassloader, если вы специально не добавили tools.jar в путь к классам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...