Java 模块真的无法访问类路径吗?

Is the classpath really not accessible to Java modules?

我对 Java 9 模块应该具有的假定行为感到有点困惑。在 O'Reilly 的 Java 9 Modularity 中,我读到了声明:

Modules cannot read the classpath, so our module can’t access types on the classpath, as illustrated in Figure 8-1.

...

The unnamed module exports all code on the classpath and reads all other modules. There is a big restriction, however: the unnamed module itself is readable only from automatic modules!

但是,在尝试解决 Eclipse 上的一个问题(maven 依赖项位于类路径而不是模块路径)时,我注意到我的应用程序的启动器设置与我读到的内容冲突。这是它执行的命令行:

/opt/jdk-16+36/bin/java -Dfile.encoding=UTF-8
-p /home/lgmonezi/workspace/my.test/target/classes
-classpath /home/lgmonezi/.m2/repository/org/hsqldb/hsqldb/2.6.0/hsqldb-2.6.0.jar
-XX:+ShowCodeDetailsInExceptionMessages
-m my.test/net.lgmonezi.test.main.FileNode

虽然存在模块-info.java,但应用程序唯一的外部依赖项是 hsqldb-2.6.0 jar。但它在类路径中,并且被显式模块访问,而不是自动模块。代码运行良好。它不应该抛出异常吗?

our module can’t access types on the classpath

您的代码没有使用任何 HSQLDB 类(直接),因此没有 access 检查在起作用。

JDBC driver being on the classpath makes it auto-register an implementation of the java.sql.Driver interface with the JDBC framework via the service-provider loading mechanism. (See JDBC 4 specification,第 9.2.1 节)

除了自动注册过程之外,没有任何代码(您的或框架的)直接“访问”任何 HSQLDB 代码。都是通过接口完成的。