ClassnotFoundException брошен при динамично загруженных файлах класса
-
28-09-2019 - |
Вопрос
У нас есть проект сервлета, который содержит (среди многих других классов) интерфейс, который мы предоставляем пользователям.
Пользователи могут скомпилировать свои собственные классы (в виде файлов .Class), которые реализуют предоставленный интерфейс, и поместите их в папку, о которой осведомлен наш проект. Когда сервлет начинается, он использует URLClassLesser для загрузки всех файлов .Class в этой папке. (Чтобы пользователи могут зацепить определенные события.)
Насколько я могу сказать, файл класса расположен и правильно загружен, Что-то вроде. При загрузке скомпилированного пользователя .Class файл .Class, исключение ClassnotFoundException, но он жалуется на интерфейс, который уже должен быть в классе.
Caused by: java.lang.ClassNotFoundException: com.company.project.OurInterface
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.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
Когда динамически загружается файл .class, есть ли причина, по которой интерфейс не найден?
Решение
Возможно, вы не указали родительский класс загрузчика для вашего URLClassLoader
.
Классический загрузчик вашей заявки должен быть родительским классовым загрузчиком вашего динамического классов:
ClassLoader dynamicClassLoader =
new URLClassLoader(..., OutInterface.class.getClassLoader());
Другие советы
Может быть, это потому, что вы пытаетесь загрузить этот интерфейс из «Динамических классов» -Path? Что происходит, когда вы бросаете свой интерфейс там тоже?
Вероятно, потому что вы используете другой класс погрузчика, и он не находит классы, загруженные его классовым загрузчиком.
Считаете ли вы использовать SPI для этого вместо этого? http://download.orcle.com/javase/1.4.2/docs/guide/jar/jar.html#service%20Provider. (Извините за старую ссылку, но подход одинаково.