在Java 9中,为什么在某些情况下包冲突的处理方式有点不同?

时间:2017-03-26 20:13:03

标签: java java-9 jigsaw

我正在尝试使用Java 9并查看以下场景:

实验1

  • 模块A
  • 模块B
  • 都声明了一个名为com.foo的非空包,但不会将其导出
  • 第三模块C
  • 都需要

从'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中给出的错误消息。如果其中一个模块没有导出它,那么最终结果将是有所不同。换句话说,产生不同错误消息背后的考虑是什么?

1 个答案:

答案 0 :(得分:7)

实验#2和#3是拆分包问题,在编译时和运行时都应该是错误。对于#2,我无法从你的帖子中看出为什么你在编译C时没有看到编译错误。你应该看到一个错误的文本,如“模块C从A和B读取包com.foo”。

实验#1可能是应用程序模块路径上的A,B和C,由于重叠的包,它们不能全部位于相同的名称空间(相同的类加载器)中。您看到的错误消息在最近的版本中有所改进。

请注意,此处的实验已在jigsaw-dev的许多主题中进行了讨论,这可能是提出问题和经验的更好地方,至少在JDK 9仍处于开发阶段时。