如果module-info.java
引用设置了“Automatic-Module-Name”的自动模块,为什么Java 9编译器会警告“需要自动模块的指令”?这些模块的风险是什么?
这个问题与What is an automatic module?不完全相同,因为后者没有解决我引用的编译器警告背后的具体原因(问题的上下文很重要)。也就是说,它是后续阅读的有用链接。
答案 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
时却没有模块描述符。
通常应谨慎使用传递依赖。