首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免Java 9中的拆分包

如何避免Java 9中的拆分包
EN

Stack Overflow用户
提问于 2018-08-13 17:55:53
回答 2查看 4.4K关注 0票数 11

我对Java 9很陌生,并且在YouTube上学习了Java的模块化视频讲座。他们提到了模块化的三个好处- 1。没有缺少依赖关系。2。没有循环依赖。3。没有分裂包。

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

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

假设有test.module1,它下面有模块信息-

代码语言:javascript
复制
module test.module1{
exports abc.pqr.xyz;
}

另一个模块信息如下的module2 -

代码语言:javascript
复制
module test.module2{
 exports abc.pqr.xyz;
}

现在假设在我的应用程序中添加了这两个模块的依赖项-

代码语言:javascript
复制
module test.myapp{
 requires test.module1;
 requires test.module2;
}

现在,我又有了两个模块依赖项,其中一些类有可能出现在这两个模块中。那么在运行时,如何从哪个模块中提取类定义呢?Java 9将如何避免拆分包问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-13 18:58:08

使用问题中描述的场景,您将开始面临一个错误:

模块test.myapptest.module1test.module2中读取包

Readability of the Modules of 模块系统的状态详细阐述了模块的使用情况如下,并将感兴趣您的用例(强调我的):

模块图中定义的可读性关系是可靠配置的基础:模块系统确保

  • 每一个依赖都是由另一个模块完成的
  • 模块图是无圈的
  • 每个模块最多读取一个定义给定包的模块。
  • 定义同名包的模块不会相互干扰。

此外,本文还详细介绍了在模块系统中使用该方法的好处。

可靠的配置不仅更可靠,还可以更快。当模块中的代码引用包中的类型时,则保证在该模块中或在该模块读取的某个模块中定义该包。 因此,在寻找特定类型的定义时,不需要在多个模块中搜索它,或者更糟的是,沿着整个类路径搜索它。

尽管如此,您实现的当前解决方案是

  • 如果模块test.module1test.module2是显式模块,则可以选择在其中一种模块中实现包abc.pqr.xyz,也可以将其从其中两种模块中提取到单独的模块test.mergeModule中,该模块随后可作为其客户端的独立模块使用。
  • 如果这些(或其中任何一个)是自动模块,您可以使用桥延伸至类路径并让这个jar留在类路径上,并被视为未命名模块,默认情况下,该模块将导出其所有包。同时,在读取所有其他命名模块的同时,任何一个自动模块也被用来读取http://openjdk.java.net/projects/jigsaw/spec/sotms/#the-unnamed-module。 再次引用该文档并举例说明,以便您能够与您的问题相关联: 如果显式模块com.foo.app中的代码引用了com.foo.bar中的公共类型,而该类型的签名是指仍在类路径上的JAR文件中的一个类型,那么com.foo.app中的代码将无法访问该类型,因为com.foo.app不能依赖未命名的模块。 这可以通过将com.foo.app临时视为一个自动模块来补救,这样它的代码就可以从类路径访问类型,直到类路径上的相关JAR文件可以被视为一个自动模块或转换为一个显式模块。
票数 9
EN

Stack Overflow用户

发布于 2018-08-13 18:09:24

Java模块系统通过在JVM启动时拒绝这类场景来解决拆分包问题。当JVM启动时,它将立即开始解析模块图,并且当它在test.myapp的模块路径中遇到两个模块时,JVM将抛出一个错误,指示test.module1test.module2试图导出相同的包。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51828014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档