Классовые аннотации и загрузчик классов в Java 11 - PullRequest
0 голосов
/ 01 апреля 2020

У меня немного JavaDo c doclet , только что переписанный для нового Java Doclet API, который запускается плагином Maven, который делает это:

1) Загружает несколько jar-файлов из каталога и добавляет их в путь к классу контекста. Это похоже на:

URL[] urls = <all .jar URLs>
URLClassLoader xClsLoader = URLClassLoader.newInstance ( urls, Thread.currentThread ().getContextClassLoader () );
Thread.currentThread ().setContextClassLoader ( xClsLoader );

2) Поиск всех экземпляров класса root и для каждого из них пытается выбрать данную аннотацию:

String classFQNs = ...
for ( String fqn: classFQNs )
{
  Class dynCls = Thread.currentThread ().getContextClassLoader ().loadClass ( fqn );
  Status statusAnnotation = dynCls.getAnnotation ( Status.class );
  if ( statusAnnotation == null )
    // DAMN IT! IT'S ALWAYS NULL!
}

Кажется, проблема в том, что Status.class находится как в пути к классам, загружаемым Maven вместе с плагином, так и в дополнительном .jar, который я добавляю в путь к классам, увиденный доклетом. Я не могу удалить его из зависимостей Maven Java Javado c, потому что это нарушит выполнение кода 2), если я не загружу тот же .jar в 1), сканирование JavaDo c завершится неудачно, потому что многие классы в других jar-файлах, участвующих в 2), расширяют класс root в этом тревожном .jar.

Да, я мог бы переставить код, разбить .jar, использовать альтернативу javado c и т. д. c, но все эти опции повлекут за собой огромные изменения в унаследованном проекте, который не является лучшим кодом качества, который вы можете себе представить.

Итак, что происходит? Раньше это работало до Java 8, я понимаю, Java> = 9 теперь видит один и тот же класс из разных jar-файлов как разные классы, даже разные безымянные модули, так что аннотация в загруженном классе не считается такой же, как тот, который пытается извлечь доклет, несмотря на то, что Status точно такой же, просто загружается по-разному, один раз Maven, другой раз моим кодом в 1). Как я мог преодолеть это? Есть ли другой способ загрузить эти .jars? Есть ли способ примирить эти самые аннотации?

...