我正在尝试关于谁可以访问和什么的各种访问规则,我在模块系统文档的状态中看到了这个声明,
未命名的模块读取所有其他模块。因此,从类路径加载的任何类型的代码都可以访问所有其他可读模块的导出类型,默认情况下,这些模块将包括所有命名的内置平台模块。
因此,我编写了以下代码以使用以下结构对其进行测试:
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
知道为什么吗?从类路径加载的任何类都应该能够访问模块导出的任何类。