当前位置: 首页 > 知识库问答 >
问题:

Java 9 重叠的非导出包

戚俊健
2023-03-14

各种资源(infoq、jigsaw-dev、osdir)表明,在不同的java模块中拥有相同的包会导致< code > layerinstantionexception ,即使这些包在模块内部(非导出)。< br >这似乎与需求所说的正好相反:

Java 编译器、虚拟机和运行时系统必须确保包含同名包的模块不会相互干扰。如果两个不同的模块包含同名的包,则从每个模块的角度来看,该包中的所有类型和成员仅由该模块定义。

那么应用程序使用的两个模块是否能够包含同名的私有包?

编辑
这是Stanislav Lukyanov指出的JMPS问题

共有2个答案

唐伟
2023-03-14

这个定义可以解释。它仍然是正确的,因为 Jigsaw 确保两个模块永远不会在发生此类冲突时通过崩溃类加载来定义共享包。

如果你查看Java 9的类加载器实现,你可以看到包名被映射到单个模块。因此,两个模块不可能有两个模块来声明所有权。但是,子父关系中的两个类装入器可能定义同一个包。

毋琪
2023-03-14

正如您链接的讨论中所述,问题在于类加载器和模块之间的映射。

当您通过类加载器CL加载两个模块M1M2时,JPMS必须拒绝这样的配置,因为否则这两个关键的JPMS原则——强大的封装和可靠的配置——都可能被破坏。通过在这里抛出异常,JPMS实际上实现了您引用的要求,并确保在执行过程中没有冲突可能会破坏任何东西。

另一方面,当您通过两个加载程序< code>CL1和< code>CL2加载< code>M1和< code>M2时,您实际上创建了两个运行时包< code>{CL1,P}和< code>{CL2,P},因此没有冲突,并且< code >层可以被实例化。

这里的可用性问题是< code>java对应用层的所有模块(从命令行参数创建的“起始”模块)使用单一加载器,这导致了< code > layerinstantionexception 。这是目前JPMS清单上的一个开放问题,请参见[此处](http://open JDK . Java . net/projects/jigsaw/spec/issues/# AvoidConcealedPackageConflicts)。但是不管问题的解决方案如何,如果需要,您应该能够通过编写一个小的主类来处理拆分的包,这个主类将创建您需要的< code >配置(顺便说一下,一个支持JPMS的应用程序容器可能会为您做这件事)。

 类似资料:
  • 我使用Java-8编译器编译了以下代码:

  • 我已经在我的项目中添加了一个导航抽屉活动,并尝试将项目作为片段添加。这就是我在主要活动中所做的。 默认片段是Home,它工作正常,正如预期的那样,但其他片段与Home片段重叠。(HomeFragment是唯一工作正常的)。我在每个片段类中都做过这样的事情: 我看不出错误在哪里。一切看起来都很好,但所有其他片段都显示在HomeFragment上。

  • 问题内容: 我已经看到了许多解决方案来识别日期范围重叠的记录,还有其他一些合并重叠范围的示例。 但是,我对显示仅重叠发生范围的结果感兴趣。实际上,我有3个ProductID(并且只有3个将存在),并且我试图为每个客户查找所有3个日期的日期范围。 问题答案: 答案如下: 这是使用自连接来计算每个产品上不同产品的数量。您需要三种截然不同的产品,因此该子句正在执行此操作。 有三种截然不同的产品,直到其中

  • 我是Android Studio的新手。当我导入一个非Android Studio项目时,它会显示这个错误。有人知道怎么解决这个问题吗?

  • 我正在研究集合的工厂方法。我看到方法有10个varargs重载(与相同)。我真的不明白为什么有这么多。最后,函数

  • 问题内容: 我想使用Python表示一组整数范围,其中该集合可以动态修改并进行包含测试。具体来说,我想将其应用于文件中的地址范围或行号。 我可以定义要关注的地址范围: 然后,我希望能够向集合中添加一个潜在的重叠范围,以便在添加集合时变为: 但是然后可以从集合中删除我可以排除范围的集合,集合变成: 最后,我希望能够遍历集合中包含的所有整数,或测试集合是否包含特定值。 我想知道执行此操作的最佳方法是什