Я пытаюсь протестировать некоторый код, который работает с Java Doc, он используется под плагином maven-javadoc-plugin.Я пытаюсь заставить его работать под JDK11.Я использую RootDoc
, который я могу использовать при запуске тестов.
В настоящее время в тестах используется EasyDoclet , что дает мне RootDoc
примерно так:
EasyDoclet easyDoclet = new EasyDoclet(new File("dir"), "com.foo.bar");
RootDoc rootDoc = easyDoclet.getRootDoc()
Однако я не мог заставить это работать под jdk11.
Первая проблема, которую я имел, была tools.jar отсутствует, поэтому я изменил свой pom.xml
, чтобы иметь:
<dependency>
<groupId>org.seamless</groupId>
<artifactId>seamless-javadoc</artifactId>
<version>1.1.1</version>
<exclusions>
<exclusion>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- maybe this will get what ever was in tools.jar -->
<dependency>
<groupId>com.github.olivergondza</groupId>
<artifactId>maven-jdk-tools-wrapper</artifactId>
<version>0.1</version>
</dependency>
Это приводит ко многим случаям:
java.lang.NoClassDefFoundError: com/sun/tools/javadoc/PublicMessager
Класс PublicMessager , кажется, существует для обнародования некоторых конструкторов, я не уверен, почему он существует в пакете com.sun.tools
.Я попытался сделать копию этого класса: открытый статический класс PublicMessager расширяет
com.sun.tools.javadoc.main.Messager {
public PublicMessager(Context context, String s) {
super(context, s);
}
public PublicMessager(Context context, String s, PrintWriter printWriter, PrintWriter printWriter1, PrintWriter printWriter2) {
super(context, s, printWriter, printWriter1, printWriter2);
}
}
, и сообщение об ошибке изменяется на:
java.lang.IllegalAccessError: superclass access check failed: class com.fun.javadoc.FooBar$PublicMessager (in unnamed module @0x4abdb505) cannot access class com.sun.tools.javadoc.main.Messager (in module jdk.javadoc) because module jdk.javadoc does not export com.sun.tools.javadoc.main to unnamed module @0x4abdb50
Я выставил jdk.javadoc
безымянному модулю, используя:
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Dfile.encoding=UTF-8</argLine>
<argLine>--add-opens=jdk.javadoc/com.sun.tools.javadoc.main=ALL-UNNAMED</argLine>
</configuration>
</plugin>
</plugins>
</build>
Это означало, что моя пользовательская версия PublicMessager
больше не будет отображать ошибки, однако не удалось найти версию из бесшовного под com.sun.tools
.Я сделал свою собственную версию EasyDoclet
, которая использовала мою PublicMessager
, но оказалось, что отсутствуют следующие два класса:
import com.sun.tools.javadoc.JavadocTool;
import com.sun.tools.javadoc.ModifierFilter;
На данный момент я не уверен, что делать.halp!
Возможно, альтернативой было бы вместо этого найти jdk11-эквивалент RootDoc
, который я считаю DocletEnvironment
, а затем кое-как, как получить реализацию этого, я понятия не имею, как получить реализациюDocletEnvironment
.