Я пишу фрагмент кода, который загружает классы 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]