JDK 11+和Javadoc

68
Exit code: 1 - javadoc: error - The code being documented uses packages in the unnamed module, but the packages defined in https://docs.oracle.com/en/java/javase/11/docs/api/ are in named modules.

有人成功使javadoc工作而无需更改源代码版本为1.8吗?(正如其他论坛建议的那样)我正在使用JDK v11.0.5,但问题仍然存在(甚至在JDK 12+上也是如此)。

编辑:此错误源于maven并由maven-javadoc-plugin引发。即使使用<source> 8</source>配置,我仍未能使其在JDK 11+上运行。


相关 https://bugs.openjdk.java.net/browse/JDK-8212233 - user7294900
我认为这个问题需要更多的细节。你使用Maven吗?你在项目中使用或尝试使用模块了吗? - rü-
@rü- 你说得对,我已经更新了帖子,谢谢。是的,我正在使用具有多模块设置的Maven。 - Rafael Ibasco
使用最新的javadoc插件,它对我有效。我最初将源设置为8,但是无法运行。鉴于您的观察,我猜测这个问题在稍后的版本中得到了修复。我目前使用的是3.2.0版本。 - David Bradley
7个回答

53

OpenJDK问题跟踪器中建议的那样,可以通过在Javadoc插件上定义源来解决此问题:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <configuration>
        <source>8</source>
    </configuration>
</plugin>

12
可能你没有完全阅读问题。OP明确提到:“有人能够使javadoc在不必更改源代码版本为1.8的情况下工作吗?” - Arvind Kumar Avinash
3
对我来说可行。我使用:<configuration> <source>${java.version}</source> </configuration>,而在属性中它是Java 11。由于某种原因,我只需要指定版本。 - ranma2913
1
你如何在Gradle中实现这个? - khatchad
2
使用JDK 8时,我将其设置为1.8,而不是8。也许两者都可以。 - joninx
还建议按照 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8212233 中提供的方案解决。 - OtherDevOpsGene
我在我的构建中使用了第11版,它解决了这个问题。 - undefined

31

在Maven javadoc插件的配置中添加<detectJavaApiLink>false</detectJavaApiLink>可以修复该错误。


3
我在 Mac 上使用 AdoptOpenJDK 11.0.8 (2020-07-14) 成功运行了这个方法。我已经设置了 <source>8</source> 并且它对于其他版本的 JDK 11 来说都是有效的,但对于 11.0.8 版本则不行。 - Doug Noel

24

我需要 Carlos Santos 的代码才能使这个工作得以实现。完整的配置包含了他的答案:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <configuration>
    <source>8</source>
    <detectJavaApiLink>false</detectJavaApiLink>
  </configuration>
</plugin>

2
谢谢。即使没有<source>8</source>,上面的片段仍然与我配合使用,结合<properties>maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties> - daparic

6

javadoc可以生成指向您使用的包的链接,例如指向.../javase/11/docs/api中记录的类。虽然您的注释位于未命名模块中,但目标不是,因此javadoc无法将这两者组合起来。它会生成一个package-listelement-list文件,因此您不能将未命名模块(包)与命名模块混合使用。

我没有找到限制javadoc尝试生成的链接的方法;因此,您可能需要为自己的项目使用模块。对我来说,这似乎很荒谬,只是为了让javadoc满意。我想这只是许多人坚持使用Java 8的原因之一。


1
我完全同意。如果maven-javadoc-plugin能够告诉我们哪些模块是未命名的,那么在处理非常大的项目时,就可以追踪问题了。此外,它还可以提供一个选项来忽略聚合中未命名的模块。但是根据文档描述,似乎并不支持这个功能:https://maven.apache.org/plugins/maven-javadoc-plugin/aggregate-mojo.html - Jörg
@Jörg 是的,这一切都非常令人讨厌,不是吗? - Jonathan Locke

3

我使用新版本的编译器插件并将发布属性设置为8,成功使我的项目运作起来。

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
</plugin>

<properties>
    <maven.compiler.release>8</maven.compiler.release>
</properties>

-2

我曾经遇到过同样的问题。我使用的是Java 11.0.3org.apache.maven.plugins:maven-javadoc-plugin:2.10.4:jar。将maven-javadoc-plugin版本更新为3.2.0对我来说完美解决了这个问题。


2
我正在使用maven-javadoc-plugin 3.2.0版本,并且正好遇到了这个错误。因此,那并没有解决问题。 - Jörg
@Jörg,你使用的是哪个Java版本? - Chinmay Kulkarni
我的Java版本是11.0.5+10。 - Jörg

-3
我们可以在配置中使用<detectOfflineLinks>false</detectOfflineLinks>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接