ClassnotFoundException брошен при динамично загруженных файлах класса

StackOverflow https://stackoverflow.com/questions/4073245

Вопрос

У нас есть проект сервлета, который содержит (среди многих других классов) интерфейс, который мы предоставляем пользователям.

Пользователи могут скомпилировать свои собственные классы (в виде файлов .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. (Извините за старую ссылку, но подход одинаково.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top