gpt4 book ai didi

Java 9 重叠的非导出包

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:11 25 4
gpt4 key购买 nike

各种资源(infoqjigsaw-devosdir)表明在不同的 java 模块中使用相同的包将导致 LayerInstantiationException,即使包在模块内部也是如此(非导出)。
这似乎与 requirements 完全相反。说:

The Java compiler, virtual machine, and run-time system must ensure that modules that contain packages of the same name do not interfere with each other. If two distinct modules contain packages of the same name then, from the perspective of each module, all of the types and members in that package are defined only by that module.

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

编辑
这是 issue由 Stanislav Lukyanov 指出的 JMPS

最佳答案

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

当您通过类加载器加载两个模块 M1M2 时,它们都包含一个未导出的(又名隐藏的)包 P CL JPMS 必须拒绝这样的配置,否则 JPMS 的两个关键原则——强封装和可靠配置——都可能被破坏。通过在此处抛出异常,JPMS 实际上实现了您引用的要求,并确保在执行过程中没有冲突可能会破坏任何内容。

另一方面,当您通过两个加载器CL1CL2 加载M1M2 时你实际上是在创建两个运行时包 {CL1, P}{CL2, P},所以没有冲突和 Layer 可以实例化。

这里的可用性问题是 java 对应用层的所有模块(“起始”模块,从命令行参数创建)使用单一加载器,这会导致 LayerInstantiationException 。这是目前 JPMS 列表上的未解决问题,请参阅 [此处] ( http://openjdk.java.net/projects/jigsaw/spec/issues/#AvoidConcealedPackageConflicts )。但是不管问题的解决方案如何,如果需要,您应该能够通过编写一个小的主类来处理拆分包,该主类将创建您需要的 Configuration (顺便说一句,JPMS 感知应用程序容器可能会为你做)。

关于Java 9 重叠的非导出包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40616739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com