Надежный поиск аннотаций для класса, загруженного с помощью URLClassLoader - PullRequest
1 голос
/ 05 мая 2010

У меня есть генератор кода, который использует URLClassLoader для загрузки классов по указанному пути, сканирования их на наличие аннотаций, а затем с помощью Reflection для полей / методов генерирует DTO.

Отлично работает в тестовом приложении.

Когда я помещаю его в Maven MOJO, я внезапно теряю способность видеть аннотации javax.persistence.Entity для классов. Он загружает их, он может видеть все поля, но аннотация сущности больше не видна.

Я предполагаю, что это как-то связано с проблемами Classpath - не так ли? Ни тестовое приложение (функция main () в самом плагине), ни MOJO не являются частью проекта, из которого получены отсканированные классы. Но одно работает, а другое нет.

У меня есть небольшой отладочный код, который распечатывает все аннотации класса, когда он их проверяет, а в неработающей версии он находит буквально ни одного.

Есть идеи, как мне отладить проблему / решить ее?

Ответы [ 4 ]

8 голосов
/ 06 мая 2010

Проблема оказалась довольно простой, хотя я не уверен, почему она работала нормально в одном случае, а не в другом.

В моем создании URLClassLoader не указан родительский загрузчик классов. Итак, я предполагаю, что ничего не смог найти. Как только я использовал

loader = new URLClassLoader(classUrls, Thread.currentThread().getContextClassLoader());

для загрузчика классов, все начало работать просто отлично. Я довольно неосведомлен, когда дело доходит до входов и выходов загрузчиков классов, так что это не было очевидно. Тем более что в примере, которому я следовал, родитель тоже не указывался.

5 голосов
/ 05 мая 2010

Когда вы сканируете загруженный класс на предмет аннотаций, вы не можете видеть аннотации, которые не могут быть найдены в classpath. То есть для чтения аннотации JPA Entity ваш генератор кода должен иметь JPA API в classpath (javax.persistence:persistence-api:1.0 в Maven).

Однако, если вы используете загрузчик классов для загрузки внешних классов и сканирования их на наличие аннотаций, у вас могут возникнуть другие проблемы с пропущенными зависимостями и выполнением статических инициализаторов. Возможно, лучшим подходом является использование библиотек манипулирования байт-кодом, таких как ASM , для сканирования классов без их загрузки.

0 голосов
/ 06 мая 2010

Я предполагаю, что это как-то связано с проблемами Classpath

Моя ставка заключается в том, что артефакт постоянства-API объявлен с предоставленной областью действия и не указан в пути к классам, передаваемому плагину. Вы можете это подтвердить?

0 голосов
/ 05 мая 2010

Аннотации имеют уровень постоянства, связанный с ними. Некоторые не выживают во время компиляции (то есть они не помещаются в файлы .class.) Убедитесь, что те, на которые вы ссылаетесь, не относятся к этому типу.

...