【问题标题】:Is the classpath really not accessible to Java modules?Java 模块真的无法访问类路径吗?
【发布时间】:2021-04-25 22:57:55
【问题描述】:

我对 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。但它在类路径中,并且由显式模块访问,而不是自动模块。代码运行良好。不应该是抛出异常吗?

【问题讨论】:

    标签: java java-platform-module-system


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这很有道理,谢谢。我忘了SPI。我已经用另一个库(json.org)进行了测试,它不使用 SPI,eclipse 把它放在模块路径上。现在我将尝试找出为什么 hsqldb 驱动程序首先要进入类路径,因为它是一个模块化 jar。再次感谢您!
    猜你喜欢
    • 2020-04-14
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多