首页 > 解决方案 > 在 jdk11 中获取 RootDoc

问题描述

我正在尝试测试一些适用于 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包下。我试图复制这个类: public static class PublicMessager extends

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;

在这一点上,我不确定该怎么做。住手!

RootDoc也许另一种选择是找到我认为的 jdk11 等价物,DocletEnvironment然后找到一些如何实现它,我不知道如何实现DocletEnvironment.

标签: javajavadocjava-11maven-javadoc-plugin

解决方案


推荐阅读