带有 --release 8 的 jdeprscan 警告

jdeprscan warning with --release 8

我有一个 standalone project based on Java-9 with a single class Main.java on which I was experimenting with the jdeprscan tool 转向 Java SE 版本,当我 运行 在我的项目中使用版本 9 时没有日志(假设这是预期的行为) 在控制台中:

➜  standalone git:(master) ✗ jdeprscan --release 9 .
Directory .:

意思是代码没有使用过弃用的 API,这对我来说似乎很合适。

然后我对版本 8 进行了同样的尝试,尽管我没有再次收到任何 Deprecated 日志,但控制台显示了该项目的某些警告:

➜  standalone git:(master) ✗ jdeprscan --release 8 .
warning: unknown enum constant javax.jws.WebParam.Mode.IN
warning: unknown enum constant javax.jws.soap.SOAPBinding.Use.LITERAL
warning: unknown enum constant javax.annotation.Resource.AuthenticationType.CONTAINER

问:为什么发布版本8有警告,而版本9没有?要在此处添加详细信息,例如在 JavaSE8 WebParam.Mode.IN 中也未标记为已弃用。

问:当我的代码不涉及任何这些枚举常量时,为什么我一开始就收到这些警告?

编辑:我正在尝试使用 JDK10(GA 版本)和 JDK11(EA),我可以在这里更新的是唯一剩下的警告是

warning: unknown enum constant javax.jws.soap.SOAPBinding.Use.LITERAL

其他两个已经消退。

Java 9 对标准库进行了重大的重新打包。这意味着当您创建一个小型应用程序时,依赖库的数量远小于 Java 中相应的要求 8. 第二个问题的答案是您的应用程序的某些传递依赖使用了那些包中的注释你收到警告。

同样,对于第一个问题,因为您没有明确列出所有包含这些注释的 jar 类,依赖项扫描器无法找到定义。该警告与弃用无关;它声明 jdeprscan 无法在 类 中找到未提供的定义。

感谢您试用 jdeprscan 工具。

这是 jdeprscan 或底层工具机制中的错误。 jdeprscan 做的第一件事是 运行 遍历 JDK 中的所有 class 以找出已弃用的内容。给定 --release 选项,它使用一些内部 javac 表,其中包含作为该版本存在的 class 库的表示,在本例中为 JDK 8. 我还没有对此进行调试,但我怀疑 JDK 中的其他地方正在引用这些特定的枚举常量,并且 jdeprscan 正在尝试查找它们以查看它们是否已被弃用。

但是,这些是在 javax.xml.wsjavax.xml.ws.annotation 模块中定义的,它们不是默认根模块集的一部分,因此正常查找不会找到它们。这可能就是发出警告的原因。 (请注意 javax.xml.wsjavax.xml.ws.annotation 模块本身已被弃用,但我认为这与此问题没有任何关系。)

我已提交 JDK-8187155 以跟踪此问题。我认为这不会影响 jdeprscan 的操作,除了会增加噪音。但如果这会导致其他问题,请跟进。

(另请注意,您的代码使用 JDK 9 API List.of 这意味着它是一个 JDK 9 class 文件。jdeprscan 如果你要求它扫描 JDK 9 class 但提供 --release 8 选项,它可能会发出警告。它也可能是一个错误,它不会发出这样的警告.)