我有一个基于java-9的独立项目,只有一个类 Main.java
我在上面试验 jdeprscan
工具以java se版本为中心,当我在我的项目上使用release 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
另外两个已经平息了。
2条答案
按热度按时间lnlaulya1#
Java9对标准库进行了重大的重新打包。这意味着,当您创建一个小型应用程序时,依赖库的数量远远小于Java8中相应的需求。第二个问题的答案是,应用程序的某些可传递依赖项在收到警告的包中使用注解。
类似地,对于第一个问题,由于没有显式列出包含这些注解类的所有jar,依赖关系扫描程序无法找到定义。警告与贬损无关;它说
jdeprscan
在未提供的类中找不到定义。f4t66c6m2#
感谢您试用
jdeprscan
工具。这是一个错误
jdeprscan
或者在底层的工具机制中。第一件事jdeprscan
要做的是遍历jdk中的所有类,找出哪些类已被弃用。鉴于--release
选项,它使用一些内部javac
包含在该版本中出现的类库表示形式的表,在本例中为jdk8。我还没有对此进行调试,但我怀疑jdk中的其他地方引用了这些特定的enum常量,并且jdeprscan
正在尝试查找它们以查看它们是否已被弃用。但是,这些定义在
javax.xml.ws
以及javax.xml.ws.annotation
模块,这些模块不是默认的根模块集的一部分,因此正常的查找不会找到它们。这可能就是发出警告的原因(请注意javax.xml.ws
以及javax.xml.ws.annotation
模块本身已被弃用,但我认为这与此问题无关。)我已经提交了jdk-8187155来追踪这个问题。我不认为这会影响
jdeprscan
除了增加噪音。但如果这会导致其他问题,请跟进。(还要注意,您的代码使用了JDK9API
List.of
这意味着它是一个jdk9类文件。jdeprscan
如果您要求它扫描JDK9类,但提供--release 8
选项。也可能是一个bug,它没有发出这样的警告。)