草庐IT

java - javadoc中模块之间的链接

coder 2024-03-21 原文

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 中的两个类生成 javadoc,它们位于 src/service 下,并将文档链接到我的应用程序中的其他 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 并且工具提示正确显示包,并且链接转到正确的 javadoc模块 uk.co.sr.db,链接是错误的,因为它不包含包的路径

Coder 是来自模块 uk.co.sr.vcher.coreuk.co.sr.vcher.Coder。在这种情况下,链接是正确的,指向 core/uk/co/sr/vcher/Coder.html

ApplicationConfigCoder 一样,来自模块 uk.co 中的包 uk.co.sr.vcher。 sr.vcher.core,链接正确。

在我的整个项目中,两个模块的链接是正确的,但所有其他模块的链接都因缺少包路径而损坏。

我以相同的方式为我的每个模块创建了 javadoc。它们在其基础上包含元素列表文件,而不是包列表文件。 uk.co.sr.vcher.service 模块依赖于 uk.co.sr.vcher.dbuk.co.sr.vcher.core 模块。

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

<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)

更新:我在 https://github.com/andrewmcguinness/javadoc_issue 上放了一个最小的示例项目——三个 java 类,三个模块——它显示了同样的问题。

更新 2:我将原因归结为包 uk.co.sr.vcher.db 的名称与模块的名称相同 英国.co.sr.vcher.db。将模块名称更改为 uk.co.sr.vcher.pdb 可以修复它。我仍然想知道这是 jdk 错误还是我做错了什么。

最佳答案

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

我已经 reported the bug to Oracle .如果有任何有用的结果,将会更新。

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

关于java - javadoc中模块之间的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51000581/

有关java - javadoc中模块之间的链接的更多相关文章

  1. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  7. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  8. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  9. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  10. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

随机推荐