JDK 1.7允许名称以点“.”开头的自定义标签。JDK 1.8则禁止此做法?

9
我已经编写了一个自定义标签库,其中名称以点号开头:.codelet.codelet.and.out等。它是使用JDK 7编译的。
当使用1.7版本的javadoc.exe生成JavaDoc时,它能够正常工作。但是当使用JDK 8生成时,它会失败,因为:
C:\...\Temp.java:5: error: no tag name after @
 * {@.codelet mypkg.Temp}`

如果我使用标记解析器(而不是标记解析器代码本身)更改代码为{@codelet mypkg.Temp}

C:\...\Temp.java:5: error: unknown tag: codelet
 * {@codelet mypkg.Temp}
Note: Custom tags that were not seen:  @.codelet
1 error

将标签源代码中的名称更改为cod.eletcode.let不好,因为code是已存在的标签名称),并使用该新名称,它可以工作。 -tag选项的JavaDoc工具文档(在该部分底部附近)说明:
避免冲突:如果您想创建自己的命名空间,则可以使用类似于包使用的点分隔命名约定:com.mycompany.todo。 Oracle将继续创建其名称不包含点的标准标签。您创建的任何标签都将覆盖Oracle定义的同名标签的行为。如果您创建@todo标签或标签,那么即使Oracle稍后创建了相同名称的标准标签,它也始终具有您定义的相同行为。
所以我错过了什么吗?还是这是一个未记录的变化,只是真的很糟糕?因为如果是这种情况,它需要对我的库进行相当大的更改。

知道了:标签概述文档


1
我认为这可能只是一个未记录的更改。我认为假设是Java标识符通常不以点开始。例如,包名称,据我所知,不能以点开头。这可能是之前版本中允许的一个小错误。您不能将您的taglet名称更改为“codelet”,或者最坏的情况下,“aliteralmind.codelet”吗? - GreyBeardedGeek
这是一个公开发布的库,被全球成千上万的Java程序员所使用(让我做个梦)。当前和即将过时的标签名称必须弃用,并创建新命名的标签以替换它们。不费脑但耗时较多,是一个很大的痛点。为避免与未来Sun标签发生冲突,建议使用点符号,因此我将采用 cod.elet (打了个寒战)。 - aliteralmind
1
你本可以避免的一个大问题,只要遵循你引用的“使用类似于包命名的点分隔命名约定”。没有任何东西支持前导点应该起作用的假设。最后,我不明白为什么你完全要在名称前加上一个点。命名空间旨在解决潜在的歧义,这只有在开发人员选择唯一的命名空间时才有效,但如果你不选择唯一的命名空间,就不需要使用它们... - Holger
我希望一年前就能理解这个。 - aliteralmind
1个回答

4
那么,我这里是不是有什么遗漏?
好的,你引用的文档部分如下所示:
“......然后您可以使用类似于包使用的点分隔命名约定:com.mycompany.todo”
请注意,它说“点分隔命名约定”,而不是“名称中带有点”。还要注意它说“类似于包使用”。如果您尝试使用“.mypackage”作为包名称,则编译器会说“不行!”。
我的理解是,你的“.codelet”标签名称不符合文档中设置的标签定义条件。因此,Java 8版本的javadoc已经更改为严格执行标签定义规则。这对你来说很不幸,但最终问题在于你的javadoc注释,而不是工具问题。

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