3

我有一个基于 Java-9的独立项目Main.java,有一个单独的类,我在其上尝试使用基于 Java SE 版本的jdeprscan工具,当我在我的项目上使用版本 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 没有?在此处添加详细信息,例如在 JavaSE8WebParam.Mode.IN中也未标记为已弃用。

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

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

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

另外两个已经消退。

4

2 回答 2

4

感谢您试用该jdeprscan工具。

这是jdeprscan底层工具机制中的错误。首先要做的jdeprscan是遍历 JDK 中的所有类以找出已弃用的内容。给定--release选项,它使用一些内部javac表,其中包含在该版本中存在的类库的表示,在本例中为 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 类文件。jdeprscan如果您要求它扫描 JDK 9 类但提供--release 8选项,则可能会发出警告。它也可能是一个错误,它没有不要发出这样的警告。)

于 2017-09-05T02:49:57.763 回答
0

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

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

于 2017-09-04T15:54:34.873 回答