为什么javac会抱怨命名的自动模块?

时间:2017-10-14 23:51:37

标签: java-9

如果module-info.java引用设置了“Automatic-Module-Name”的自动模块,为什么Java 9编译器会警告“需要自动模块的指令”?这些模块的风险是什么?

这个问题与What is an automatic module?不完全相同,因为后者没有解决我引用的编译器警告背后的具体原因(问题的上下文很重要)。也就是说,它是后续阅读的有用链接。

2 个答案:

答案 0 :(得分:3)

引用Remi Forax

  

主要问题是自动模块可以从类路径中查看类,但它也会导出所有包,因此没有封装,一旦需要一个自动模块,模块路径中的所有自动模块都可见。

     

因此,当您转换到模块世界时,自动模块是一个很好的工具,但是很好,您不需要依赖图中的任何自动模块。

答案 1 :(得分:2)

嗯,问题在于自动模块需要传递所有其他模块。因此,通过要求它,您会用很多东西污染依赖图,然后您可能会得到非常令人惊讶的行为。

想象一下: 您有一个(显式)模块com.logging所需的自动模块my.app。但是,您还有另一个名为my.app的自动模块(com.dbconnectors不需要,仅位于模块路径中)。它会被加载,因为当需要一个自动模块时,其他所有模块也将得到解决。 my.app也可以访问它,因为com.logging需要传递。

然后,当您的模块my.app需要com.logging时,使用com.dbconnectors中的内容“神奇地”工作的代码就可以了,而当您从requires com.logging中删除ContentView时却没有模块描述符。

通常应谨慎使用传递依赖。