【发布时间】:2019-10-30 16:15:58
【问题描述】:
我正在尝试关于谁可以访问和什么的各种访问规则,我在模块系统文档的状态中看到了这个声明,
未命名的模块读取所有其他模块。因此,从类路径加载的任何类型的代码都可以访问所有其他可读模块的导出类型,默认情况下,这些模块将包括所有命名的内置平台模块。
因此,我编写了以下代码以使用以下结构对其进行测试:
moduleA/modA.A --> automod/automod.Foo --> nonmodular.Junk --> moduleX/modX.X
基本上,
moduleA 的
modA.A调用非模块化类automod.Foo上的方法。automod.Foo被打包成automod.jar,放在module-path上。 moduleA 的 module-info 有requires automod;子句。正如预期的那样,这可以正常工作。automod.Foo调用nonmodular.Junk类的方法。将nonmodular.Junk打包成nonmodular.jar,放在classpath上。正如预期的那样,这可以正常工作。nonmodular.Junk调用 moduleX 的modX.X上的方法。modX.X被打包成moduleX.jar。 就是这一步有问题。如果我将 moduleX.jar 放在类路径上,但如果我将 moduleX.jar 放在模块路径上,它就可以工作。 (moduleX 的模块信息确实有exports modX;子句。)
换句话说,以下命令有效:
java --module-path moduleA.jar;automod.jar; -classpath nonmodular.jar;moduleX.jar --module moduleA/modA.A
输出如下:
In modA.A.main() Calling automod.Foo()
In automod.Foo()
In modA.A.main() Calling automod.foo.main()
In automod.Foo.main() Calling nonmodular.Junk()
In automod.Foo.main() Calling nonmodular.Junk.main()
In nonmodular.Junk.main calling new modX.X()
In modX.X()
但是下面的命令不起作用:
java --module-path moduleA.jar;automod.jar;moduleX.jar -classpath nonmodular.jar; --module moduleA/modA.A
这是输出:
In modA.A.main() Calling automod.Foo()
In automod.Foo()
In modA.A.main() Calling automod.foo.main()
In automod.Foo.main() Calling nonmodular.Junk()
In automod.Foo.main() Calling nonmodular.Junk.main()
In nonmodular.Junk.main calling new modX.X()
Exception in thread "main" java.lang.NoClassDefFoundError: modX/X
at nonmodular.Junk.main(Junk.java:5)
at automod/automod.Foo.main(Foo.java:10)
at moduleA/modA.A.main(A.java:10)
Caused by: java.lang.ClassNotFoundException: modX.X
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 3 more
知道为什么吗?从类路径加载的任何类都应该能够访问模块导出的任何类。
【问题讨论】:
-
如果需要,我可以附上以上所有类的代码。
标签: java module classpath module-path unnamed-module