javadoc中模块之间的链接

时间:2018-06-23 11:08:15

标签: java javadoc java-9

在Java 10中,javadoc命令中的-link选项对我来说与模块不一致。

具体来说,如果从属模块名称与其导出的包的名称相同,则该功能不起作用

我运行以下命令

/opt/jdk-10.0.1/bin/javadoc -html5 
 -subpackages uk.co.sr.vcher.service \
 --source-path src/service \
 --module-path lib:app -d javadoc/service \
 -link ../auth -link ../db -link ../models \
 -link ../core -link ../render \
 -link https://docs.oracle.com/javase/10/docs/api \
 -linksource src/service/uk/co/sr/vcher/service/Service.java \
  src/service/uk/co/sr/vcher/service/ServiceImpl.java \
  src/service/module-info.java

因此,这将为包uk.co.sr.vcher.service中的两个类(分别位于src / service下)生成javadoc,并将文档链接到应用程序中的其他5个模块,以及jdk文档

我构建的模块jar在app /中,外部依赖项在lib /

Javadoc成功并生成HTML。但是到我的应用程序某些其他模块(不是全部)的类的链接断开了,缺少了软件包的路径目录。

我在下面显示的是uk.co.sr.vcher.service.ServiceImpl的一个构造函数的一部分HTML输出。它包含四个参数:FileConnectionSourceCoderApplicationConfig

为了便于阅读,我删除了附加到ServiceImpl的链接,并添加了一些空格。这是我关注的四个参数类型的链接。

Filejava.io.File,并且正确链接到docs.oracle.com

ConnectionSourceuk.co.sr.vcher.db.ConnectionSource,并且工具提示正确显示了软件包,并且链接转到了正确模块uk.co.sr.db的javadoc时,该链接是错误的,因为它不正确。包括包装的路径

Coder来自模块uk.co.sr.vcher.Coder的{​​{1}}。在这种情况下,指向uk.co.sr.vcher.core

的链接是正确的

core/uk/co/sr/vcher/Coder.htmlApplicationConfig一样,来自模块Coder中的软件包uk.co.sr.vcher,并且链接正确。

在我的整个项目中,指向两个模块的链接是正确的,但是到所有其他模块的链接由于缺少包路径而中断。

我已经以相同的方式为每个模块创建了Javadoc。它们在其基础上包含元素列表文件,而不是软件包列表文件。 uk.co.sr.vcher.core模块取决于uk.co.sr.vcher.serviceuk.co.sr.vcher.db模块。

据我所知,可以成功链接的模块与不能链接的模块之间的区别是“好”模块不在任何其他子包中。即模块uk.co.sr.vcher.core包含程序包uk.co.sr.vcher.db,它是程序包uk.co.sr.vcher.db的子程序包,它包含在模块uk.co.sr.vcher中。但这不应该破坏任何东西。

uk.co.sr.vcher.core

更新:我放置了一个最小的示例项目-三个Java类,三个模块-在https://github.com/andrewmcguinness/javadoc_issue

上显示了相同的问题

更新2 :我将原因归结为软件包<span class="memberNameLink"> ServiceImpl</span>( <a href="https://docs.oracle.com/javase/10/docs/api/java/io/File.html?is- external=true" title="class or interface in java.io" class="externalLink">File</a> workDirectory, <a href="../../../../../../db/ConnectionSource.html?is- external=true" title="class or interface in uk.co.sr.vcher.db" class="externalLink">ConnectionSource</a> db, <a href="../../../../../../core/uk/co/sr/vcher/Coder.html?is- external=true" title="class or interface in uk.co.sr.vcher" class="externalLink">Coder</a>&nbsp;coder, <a href="../../../../../../core/uk/co/sr/vcher/ApplicationConfig.html?is- external=true" title="class or interface in uk.co.sr.vcher" class="externalLink">ApplicationConfig</a> config) 的名称与模块uk.co.sr.vcher.db的名称相同。将模块名称更改为uk.co.sr.vcher.db即可对其进行修复。我仍然想知道这是否是jdk错误或我做错了什么。

1 个答案:

答案 0 :(得分:1)

我将继续将其称为javadoc错误。我不太了解javadoc代码,但是它很可能内部将程序包和模块存储在同一词典中,因此,如果模块与程序包具有相同的名称,则它将覆盖程序包信息。然后,当必须查找包的路径时,它将失败,并且默认为空字符串。

我有reported the bug to Oracle。如果结果有用,将进行更新。

解决方法是将您的模块(在我的示例中为uk.co.sr.vcher.db)重命名为不是导出软件包之一的名称。