【问题标题】:Can't link to JDK10 in Javadoc comments无法在 Javadoc 注释中链接到 JDK10
【发布时间】:2018-09-02 14:47:57
【问题描述】:

从 Java 9 升级到 10 后,在使用 Javadoc 工具生成文档时,指向 JDK 的链接不再起作用(例如,对于导入 java.util.Optional 的文件,{@link Optional} 呈现为 Optional 而不是 Optional ; 与@see@param@return 以及您通常会看到 Javadoc 链接的其他任何地方都有同样的问题。

我有一个简单的模块化项目,我正在使用带有 Javadoc 插件的 Maven(configuration 编译器插件部分中的sourcetarget 选项设置为10)。我的理解是,默认情况下它将-link https://docs.oracle.com/javase/10/docs/api/ 传递给Javadoc 工具。我的理解也是,从历史上看,Javadoc 工具期望一个名为package-list 的文本文件出现在告诉它查找外部文档的 URL 上。 Java 8has one。 Java 9has one。 Java 10 does not(404 错误)。显然,Javadoc 工具现在为模块化项目输出一个名为 element-list 而不是 package-list 的文本文件,但似乎 isn't provided 要么(也不适用于 Java 9,但它可用于 @ 的早期访问版本987654327@).

通过 IntelliJ 生成 Javadoc 并启用选项 Link to JDK documentation 会产生相同的结果。它说它正在将-link https://docs.oracle.com/javase/10/docs/api/ 传递给javadoc.exe,并报告javadoc: error - Error fetching URL: https://docs.oracle.com/javase/10/docs/api/。尽管有错误,但它确实输出了 Javadoc,但与 Maven 一样,不存在 JDK 链接。

这应该如何工作? Oracle 把 JDK 文档放到网上是不是搞砸了?

pom.xml的相关位:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>10</source>
                <target>10</target>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.ow2.asm</groupId>
                    <artifactId>asm</artifactId>
                    <version>6.1</version> <!--update dependency for Java 10 compatibility-->
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <id>attach-javadocs</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

mvn -version 的输出:

Apache Maven 3.5.3 (3383c37e1f9e9b3bc3df5050c29c8aff9f295297; 2018-02-24T12:49:05-07:00)
Maven home: C:\Program Files\apache-maven-3.5.3\bin\..
Java version: 10, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk-10
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

【问题讨论】:

  • @JacobG。文档本身存在并且工作正常。尝试使用 Javadoc 标记链接到它们时会出现问题。
  • 三天前发布 Java 10 时,文档从 download.java.net 移至 docs.oracle.com
  • @nullpointer mvn clean test javadoc:javadoc(我有一些 JUnit 5 测试,我正在使用 Maven Surefire 插件的 2.19.1 版)。没有异常,构建成功。 mvn clean package 也适合我。我已将mvn -version 的输出添加到问题的底部。
  • @gdejohn 可能我遇到了另一个针对 3.0.1 修复的后续错误场景。但我同意,与 Java-9 相比,文档链接的生成似乎中断了。也同意这一点,即使我用来测试先前链接的问题的最新的 maven-javadoc-plugin 的 3.0.1-SNAPSHOT 也不包含 10 的 package-list。我的一些直觉只是不断投入并指向Removal of the old standard doclet 的方向,这可能会影响插件。
  • 我猜也是因为...... 我的理解是默认情况下它会将 -link docs.oracle.com/javase/10/docs/api 传递给 Javadoc 工具。这也是我的理解,过去,Javadoc工具期望一个名为 package-list 的文本文件出现在告诉它查找外部文档的 URL 中 .... 请注意 Java10 中的更改,It should be an error if javadoc cannot access the contents of aURL for -link.

标签: java maven javadoc maven-javadoc-plugin java-10


【解决方案1】:

这有两个部分。

  1. 在 JDK 10 中,文件的格式和名称已更改,以更好地支持模块。新名称是“element-list”,格式的更改允许 javadoc 工具知道 API 中存在哪些模块以及哪些包。

  2. 发布在https://docs.oracle.com/javase/10/docs/api/overview-summary.html 的 API 副本似乎阻止了“元素列表”文件,给出了 404。需要调查和修复。

请注意,您需要使用 JDK 10 版本的 javadoc 来指向 JDK 10 API。该工具的最新版本同时支持 element-list(用于关于模块的文档)和 package-list(用于关于包的文档(即没有模块))。

【讨论】:

  • 我能够通过 Maven Javadoc 插件使用 javadoc.exe-linkoffline 选项解决本地 package-file 的问题,但是当我尝试使用 element-list 时,它没有不行(见my answer)。知道为什么吗? mvn -version 说它正在使用 Java 10。
  • 我们正在调查 404。
  • 我也很好奇为什么Java 9没有element-list(404错误),但是有package-list
  • 修复了导致 .../element-list 给出 404 的问题。
  • 现在element-list 可用,从Oracle 端解决了问题。但是Maven仍然有问题。 Javadoc 插件配置选项detectJavaApiLink(默认启用)应该为您找出JDK Javadoc URL,但如果我明确提供带有插件选项links 的URL,我只会在生成的Javadoc 中获得JDK 链接。
【解决方案2】:

我目前的解决方法是使用 Maven Javadoc 插件的 offlineLinks 选项(对应于 Javadoc 工具的 linkoffline 选项)将 javadoc.exe 指向本地 package-list。我在插件的configuration 部分添加了以下内容:

<detectJavaApiLink>false</detectJavaApiLink>
<offlineLinks>
    <offlineLink>
        <url>https://docs.oracle.com/javase/${maven.compiler.release}/docs/api/</url>
        <location>${project.basedir}</location>
    </offlineLink>
</offlineLinks>

我在pom.xmlproperties 部分添加了&lt;maven.compiler.release&gt;10&lt;/maven.compiler.release&gt;,这样我就可以在url 的值中使用${maven.compiler.release}。 (这使得sourcetarget 编译器选项变得多余,但IntelliJ 在导入Maven 项目时似乎不理解release,所以我保留了它们。)

我创建了一个名为package-list(无文件扩展名)的文本文件,并将其放在项目的根目录中(因此${project.basedir} 对应location,它将在其中查找package-list)。该文件如下所示:

java.lang
java.util
java.util.concurrent
java.util.function
java.util.stream

它只需要您尝试链接到的包。我还尝试将文件命名为 element-list 并遵循 javadoc.exe 用于模块化项目的格式,如下所示:

module:java.base
java.lang
java.util
java.util.concurrent
java.util.function
java.util.stream

但这不起作用(Javadoc 成功生成,但没有 JDK 链接,和以前一样)。它抱怨找不到package-list

所以,再一次,pom.xml 的相关位:

<properties>
    <maven.compiler.release>10</maven.compiler.release> <!--release makes source and target-->
    <maven.compiler.source>10</maven.compiler.source> <!--redundant, but IntelliJ doesn't-->
    <maven.compiler.target>10</maven.compiler.target> <!--use release when importing-->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <dependencies>
                <dependency>
                    <groupId>org.ow2.asm</groupId>
                    <artifactId>asm</artifactId>
                    <version>6.1</version> <!--update dependency for Java 10 compatibility-->
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <detectJavaApiLink>false</detectJavaApiLink>
                <offlineLinks>
                    <offlineLink>
                        <url>https://docs.oracle.com/javase/${maven.compiler.release}/docs/api/</url>
                        <location>${project.basedir}</location>
                    </offlineLink>
                </offlineLinks>
            </configuration>
            <executions>
                <execution>
                    <id>attach-javadocs</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
</build>

【讨论】:

  • 我还建议同时将其提高到 maven issue tracker 以便他们可以 - 进一步提高到 JDK 并了解 Java10 中缺少包列表的原因或 - 提供如果计划从 JDK 版本更改,则替代解决方案。
【解决方案3】:

...这里是 Maven 提交者。

已经在 master 中的 Maven Javadoc 插件中添加了适当的位,但是由于 Java 11 中 javadoc(1) 中的错误,这无济于事。有关详细信息,请参阅 MJAVADOC-561。损坏的链接只能由 Oracle 修复。

编辑:Oracle 计划针对 Java 11.0.2 进行修复。

【讨论】:

    猜你喜欢
    • 2012-03-03
    • 2015-11-02
    • 2015-02-15
    • 2012-05-08
    • 2012-03-17
    • 2016-07-19
    • 2013-12-15
    • 2012-05-30
    • 2012-09-16
    相关资源
    最近更新 更多