JDK9中添加java.xml.ws模块可编译依赖javax.annotation类的原因探究
为什么添加
java.xml.ws模块能编译依赖javax.annotation.Generated的代码? 这其实是JDK 9模块系统里一个容易被忽略的自动模块依赖传递特性导致的,咱们一步步拆解这个现象:
1. java.xml.ws的隐式依赖关系
虽然从模块声明的表面来看,java.xml.ws没有直接声明依赖java.xml.ws.annotation,但JDK 9中的Java EE相关模块大多属于自动模块(Automatic Module)——也就是没有module-info.java的旧JAR包被模块系统自动识别的模块。
java.xml.ws的MANIFEST.MF文件里其实声明了对java.xml.ws.annotation的依赖,当你用--add-modules java.xml.ws时,模块系统会自动解析这个模块的依赖链,把java.xml.ws.annotation也加入到模块图中。
2. 自动模块的特殊行为
自动模块有两个关键特性刚好解释了这个现象:
- 自动模块会自动导出所有包含的包;
- 自动模块会自动解析并依赖它在MANIFEST.MF中声明的所有模块,或者说,会依赖所有能找到的其他自动模块。
所以当你添加java.xml.ws时,它的依赖java.xml.ws.annotation会被自动拉入模块图,原本不可见的javax.annotation包也就变得可以被你的代码访问了。
3. 错误提示的补充说明
错误提示建议你直接添加java.xml.ws.annotation,这是最直接的解决方案,但你用java.xml.ws也能生效,本质上是借助了自动模块的依赖传递,间接引入了需要的模块。
你可以用jdeps工具验证这个依赖关系,执行命令:
jdeps --module-path "c:\Program Files\Java\jdk-9.0.1\jmods" --describe-module java.xml.ws
在输出里你会明确看到java.xml.ws确实依赖java.xml.ws.annotation模块。
内容的提问来源于stack exchange,提问作者Brecht Yperman
相关产品推荐
相关产品推荐

