java - 修补模块引发模块未找到错误

标签 java java-9 java-module java-platform-module-system

我使用 jdk 11 并尝试理解 java 编译器的 --patch-module 选项。这是我的简单模块:

mdl-platform
      |
      |
      |___com.test.mdl.platform
      |            |
      |            |___ ...
      |            |
      |            |___Patch.java
      |
      |___module-info.java

module-info.java:

module com.test.mdl.plarform {
    exports com.test.mdl.platform;
}

补丁.java:

public class Patch { }

我有 Patch.java 文件,想用它来修补模块。我试过:

我。

$ javac --patch-module com.test.mdl.platform=mdl-plarform/src/main/java/ \
                mdl-plarform/src/main/java/com/test/mdl/platform/Patch.java 
error: module not found: com.test.mdl.platform
1 error

我还运行了一些伪造的模块路径并且它工作正常(生成了一个有效的 class 文件):

II.

$ javac --patch-module com.test.mdl.platform=some/fake/path/ \
      mdl-plarform/src/main/java/com/test/mdl/platform/Patch.java 

那么为什么第一个示例失败了,但是目录存在并且包含有效的 module-info.java,而第二个示例即使路径不存在也能正常工作?

最佳答案

我将留下一些关于 javac 如何与选项 --patch-module 一起工作的研究。

我。不在模块路径中的有效 --patch-module 路径和模块名称

$ javac --patch-module com.test.mdl.platform=mdl-plarform/src/main/java/ \
                mdl-plarform/src/main/java/com/test/mdl/platform/Patch.java 
error: module not found: com.test.mdl.platform
1 error

这失败了。

Javac 应用常规 module path scan查找在 --patch-module 等式左侧指定的模块(在这种特殊情况下为 com.test.mdl.platform)。

对于这个不在模块路径中的模块,它显然失败了,相关的module not found错误是reported .模块 com.test.mdl.platform 不在模块路径中,因此该行为是预期的。

二。有效的模块名称和假路径

$ javac --patch-module com.test.mdl.platform=some/fake/path/ \
      mdl-plarform/src/main/java/com/test/mdl/platform/Patch.java 

这“没问题”。

原因是 javac 检查在 --patch-module 参数右侧指定的路径是否正确。 路径正确,前提是它包含(直接或间接)正在编译的文件

检查在 com/sun/tools/javac/file/Locations.java 中执行.可以看出,它只是在 Path mdl-plarform/src/main/java/com/test/mdl/platform/Patch.java 上循环迭代并与 some/fake/path/ 进行比较。

如果路径不正确,则返回 null 并且 the module is not being patched .在这种情况下,该文件被视为属于未命名的模块

三。路径存在,但既不包含 module-info.java 也不包含 module-info.class

$ javac --patch-module java.logging=mdl-plarform \ 
      mdl-plarform/src/main/java/com/test/mdl/platform/Patch.java

这工作正常。

原因是模块 java.logging 包含在运行时镜像中,可以在模块查找期间找到。下一步是find either module-info.java or module-info.class在目录中。在这种情况下,它会失败,因为它不包含它,然后它回退到在成功的运行时镜像中查找 module-info.class

IV.有效的模块名称和模块路径,但模块名称不匹配

$ javac --patch-module java.logging=mdl-plarform/src/main/java \
      mdl-plarform/src/main/java/com/test/mdl/platform/Patch.java

mdl-plarform/src/main/java/module-info.java:1: error: module name com.test.mdl.plarform does not match expected name java.logging
module com.test.mdl.plarform {
^
error: cannot access module-info
  cannot resolve modules
2 errors

这失败了。

--patch-module 中指定的目录中找到 module-info.java 后,它会被解析并包含模块名称 is checked for equality with the name specified in the --patch-module .在这种情况下,我们有不匹配,因此会打印相关错误。

我通过简单地使用常规 Java 调试器调试 javac 来检查此行为。因此,这样做的唯一目的是解释问题中描述的案例中发生了什么。

关于java - 修补模块引发模块未找到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57259605/

相关文章:

java - JPMS 是否支持来自 META-INF/services 的自动模块服务?

java - 显示小数时出现问题

reactive-programming - 对 java.util.concurrent.Flow.Processor<T,R> 的良好实现/支持

java - boot层初始化出错FindException : Module not found

java-9 - 如何在运行时包含 java 9 模块?

java - 在 Java Shell 中启用断言

java - 类加载器 + 模块 = 测试难题

java - 扩展java点类以找到中点

java - Spring MVC Rest App - 加载属性的最佳实践

java - 如何计算包含幂 (2^3^5) 的 java 表达式