Java 9中如何避免拆分包
我是Java 9新手,正在YouTube上观看Java的模块化视频讲座。 他们提到了模块化的3个好处- 1.没有缺少依赖项 2.无循环依赖性 3.没有拆分包 就我对拆分包的理解而言,假设一个应用程序依赖于多个依赖项,假设包abc.pqr.xyz存在于多个jar中。 然后,该包中的一些类可能会从jar1使用,而其他类则会从jar2使用。 这可能会导致运行时出现一些难以调试的问题 视频说模块化解决了这个问题。 但这正是我想要理解的 假设有test.module1,它包含以下模块信息-Java 9中如何避免拆分包,java,java-9,modularization,Java,Java 9,Modularization,我是Java 9新手,正在YouTube上观看Java的模块化视频讲座。 他们提到了模块化的3个好处- 1.没有缺少依赖项 2.无循环依赖性 3.没有拆分包 就我对拆分包的理解而言,假设一个应用程序依赖于多个依赖项,假设包abc.pqr.xyz存在于多个jar中。 然后,该包中的一些类可能会从jar1使用,而其他类则会从jar2使用。 这可能会导致运行时出现一些难以调试的问题 视频说模块化解决了这个问题。 但这正是我想要理解的 假设有test.module1,它包含以下模块信息- module
module test.module1{
exports abc.pqr.xyz;
}
具有以下模块信息的另一个模块2-
module test.module2{
exports abc.pqr.xyz;
}
现在让我们假设在我的应用程序中,我添加了这两个模块的依赖项-
module test.myapp{
requires test.module1;
requires test.module2;
}
现在我有两个模块依赖项,其中一些类可能会出现在这两个模块中。
那么在运行时,如何从哪个模块解析类定义呢?
Java 9将如何避免拆分包问题?Java模块系统通过在JVM启动时拒绝此类场景来解决拆分包问题。当JVM启动时,它将立即开始解析模块图,当它在
test.myapp
的模块路径中遇到两个模块时,JVM将抛出一个错误,指示test.module1
和test.module2
正在尝试导出相同的包。在问题中描述的情况下,您将开始遇到以下错误:
模块test.myapp
从test.module1
和test.module2
模块的可读性详细介绍了以下模块的使用,并将引起您的兴趣(重点是我的):
模块图中定义的可读性关系是基础
可靠配置:模块系统确保
- 每个依赖性都由另一个模块精确地实现
- 模图是非循环的
- 每个模块最多读取一个定义给定包的模块
- 并且定义同名包的模块不会相互干扰
也就是说,您的实现的当前解决方案是
- 如果模块
和test.module1
是显式模块,则可以选择在其中任一模块中实现包test.module2
或者您将它从两者中拉出,放入您自己的单独模块abc.pqr.xyz
,该模块随后可以作为独立模块跨其客户端使用test.mergeModule
- 如果这些(或其中任何一个)是自动模块,您可以使用,并让此类jar保留在类路径上,并被视为未命名模块,默认情况下,该模块将导出其所有包。同时,任何自动模块在读取其他命名模块的同时,也会使其读取
再次引用文档并举例说明,以便您能够关联您的问题:
如果显式模块com.foo.app中的代码引用
,例如,该类型的签名指的是 其中一个JAR文件仍在类路径上,然后将代码放入com.foo.bar
将无法访问该类型,因为com.foo.app
不能依赖于未命名的模块 这可以通过将com.foo.app
临时视为自动模块来解决,以便 代码可以从类路径访问类型,直到 类路径上的相关JAR文件可以视为自动 模块或转换为显式模块com.foo.app