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

问题描述

我对 Java 9 模块应该具有的假设行为有些困惑。在 O'Reilly 的 Java 9 Modularity 中,我阅读了以下声明:

模块不能读取类路径,所以我们的模块不能访问类型 类路径,如图 8-1 所示。

...

未命名模块导出类路径上的所有代码并读取所有 其他模块。但是有一个很大的限制:未命名的模块 本身只能从自动模块中读取!

但是,在尝试解决 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

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

解决方法

我们的模块无法访问类路径上的类型

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

类路径上的 JDBC driver 使其通过 java.sql.Driver 加载机制自动向 JDBC 框架注册 service-provider 接口的实现。 (参见 JDBC 4 specification,第 9.2.1 节)

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