我正在尝试使用Java 9并查看以下场景:
实验1
从'C'运行main会产生运行时错误:
java.lang.RuntimeException:模块B和模块A中的包com.foo
实验2
与之前相同,但这次都导出了com.foo。
从C执行main的结果:
java.lang.module.ResolutionException:模块B和A将包com.foo导出到模块C
实验3
与2相同,但这次我在模块C中声明了包com.foo。
现在我收到编译错误: 错误:(4,1)java:模块C从A和B读取包com.foo
为什么前两个案例在编译期间没有被捕获?在执行程序之前是否有运行时属性我不知道这是否排除解决方案?
另外,就错误消息而言:实验2中的错误消息以何种方式优于实验1中给出的错误消息。如果其中一个模块没有导出它,那么最终结果将是有所不同。换句话说,产生不同错误消息背后的考虑是什么?
答案 0 :(得分:7)
实验#2和#3是拆分包问题,在编译时和运行时都应该是错误。对于#2,我无法从你的帖子中看出为什么你在编译C时没有看到编译错误。你应该看到一个错误的文本,如“模块C从A和B读取包com.foo”。
实验#1可能是应用程序模块路径上的A,B和C,由于重叠的包,它们不能全部位于相同的名称空间(相同的类加载器)中。您看到的错误消息在最近的版本中有所改进。
请注意,此处的实验已在jigsaw-dev的许多主题中进行了讨论,这可能是提出问题和经验的更好地方,至少在JDK 9仍处于开发阶段时。