2017-09-04 56 views
4

我有一个基于Java-9的standalone project与单个类Main.java我正在试验在Java SE版本上摆动的jdeprscan tool,当我在我的项目上使用版本9运行相同的没有日志(假设是预期的行为)的控制台:jdeprscan警告与--release 8

➜ 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中也未标记为弃用。

问:为什么我在首位,甚至让这些警告,当我的代码没有任何与这些枚举常量的参与?

回答

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选项也许应该发出警告,它可能也是一个bug,它不会发出这样的警告。)

+0

(1)感谢Stuart恢复原状并报告错误。 (2)* jdeprscan试图查找它们以查看它们是否被弃用*但我认为它们在Java8中也不被弃用,在问题 (3)中已经链接*请注意,您的代码使用了JDK 9 API List.of这意味着它是一个JDK 9类文件* ...我认为module-info.java是一个更好的证明。 – nullpointer

0

Java 9已经完成了标准库的重新包装。这意味着,当您创建一个小应用程序时,依赖库的数量远远小于Java 8中的相应需求。第二个问题的答案是,应用程序的一些传递依赖性会在出现警告的那些包中使用注释。

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

+0

该项目的唯一依赖模块是['java.base'](https://github.com/namannigam/Jigsaw/blob/master/独立/ SRC /独立/ module-info.java)。即使我将其删除,警告仍然存在。 ***依赖库的数量比Java 8中相应的要求小得多***我没有用'jdeprscan'得到这个。正如文档链接所说**使用jdeprscan工具作为静态分析工具,可以扫描jar文件(或其他类文件聚合)以使用已弃用的API元素。**并且我不确定为什么其他警告不是显示。 – nullpointer