Java 9中如何避免拆分包

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

我是Java 9新手,正在YouTube上观看Java的模块化视频讲座。 他们提到了模块化的3个好处- 1.没有缺少依赖项 2.无循环依赖性 3.没有拆分包

就我对拆分包的理解而言,假设一个应用程序依赖于多个依赖项,假设包abc.pqr.xyz存在于多个jar中。 然后,该包中的一些类可能会从jar1使用,而其他类则会从jar2使用。 这可能会导致运行时出现一些难以调试的问题

视频说模块化解决了这个问题。 但这正是我想要理解的

假设有test.module1,它包含以下模块信息-

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中的代码引用
    com.foo.bar
    ,例如,该类型的签名指的是 其中一个JAR文件仍在类路径上,然后将代码放入
    com.foo.app
    将无法访问该类型,因为
    com.foo.app
    不能依赖于未命名的模块

    这可以通过将
    com.foo.app
    临时视为自动模块来解决,以便 代码可以从类路径访问类型,直到 类路径上的相关JAR文件可以视为自动 模块或转换为显式模块


谢谢您提供的信息。我在你的答案后发现了这个链接,它清楚地说明了同样的情况-