我对Java 9很陌生,并且在YouTube上学习了Java的模块化视频讲座。他们提到了模块化的三个好处- 1。没有缺少依赖关系。2。没有循环依赖。3。没有分裂包。
就我所理解的拆分包而言,假设一个应用程序依赖于多个依赖项,并且假设包abc.pqr.xyz存在于更多的1 jar中。然后,该包中的一些类可能将从jar1中使用,而其他类则来自jar2。这可能会导致运行时出现一些很难调试的问题。
视频说模块化解决了这个问题。但这就是我想要理解的吗?
假设有test.module1,它下面有模块信息-
module test.module1{
exports abc.pqr.xyz;
}另一个模块信息如下的module2 -
module test.module2{
exports abc.pqr.xyz;
}现在假设在我的应用程序中添加了这两个模块的依赖项-
module test.myapp{
requires test.module1;
requires test.module2;
}现在,我又有了两个模块依赖项,其中一些类有可能出现在这两个模块中。那么在运行时,如何从哪个模块中提取类定义呢?Java 9将如何避免拆分包问题?
发布于 2018-08-13 18:58:08
使用问题中描述的场景,您将开始面临一个错误:
模块
test.myapp从test.module1和test.module2中读取包
Readability of the Modules of 模块系统的状态详细阐述了模块的使用情况如下,并将感兴趣您的用例(强调我的):
模块图中定义的可读性关系是可靠配置的基础:模块系统确保
此外,本文还详细介绍了在模块系统中使用该方法的好处。
可靠的配置不仅更可靠,还可以更快。当模块中的代码引用包中的类型时,则保证在该模块中或在该模块读取的某个模块中定义该包。 因此,在寻找特定类型的定义时,不需要在多个模块中搜索它,或者更糟的是,沿着整个类路径搜索它。
尽管如此,您实现的当前解决方案是
test.module1和test.module2是显式模块,则可以选择在其中一种模块中实现包abc.pqr.xyz,也可以将其从其中两种模块中提取到单独的模块test.mergeModule中,该模块随后可作为其客户端的独立模块使用。com.foo.bar中的公共类型,而该类型的签名是指仍在类路径上的JAR文件中的一个类型,那么com.foo.app中的代码将无法访问该类型,因为com.foo.app不能依赖未命名的模块。
这可以通过将com.foo.app临时视为一个自动模块来补救,这样它的代码就可以从类路径访问类型,直到类路径上的相关JAR文件可以被视为一个自动模块或转换为一个显式模块。发布于 2018-08-13 18:09:24
Java模块系统通过在JVM启动时拒绝这类场景来解决拆分包问题。当JVM启动时,它将立即开始解析模块图,并且当它在test.myapp的模块路径中遇到两个模块时,JVM将抛出一个错误,指示test.module1和test.module2试图导出相同的包。
https://stackoverflow.com/questions/51828014
复制相似问题