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

2024-04-30

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

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

module-info.java:

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

Patch.java:

public class Patch { }

I have Patch.java文件并想用它来修补模块。我试过:

I.

$ 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 file):

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.

I. 有效的 --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适用常规模块路径扫描 https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ModuleFinder.java#l174查找左侧指定的模块--patch-module平等 (com.test.mdl.platform在这种特殊情况下)。

对于不在模块路径中的该模块,它显然会失败并且相关module not found错误是reported https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java#l1387。该模块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 https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java#l1087。可以看出,它只是简单地循环Path mdl-plarform/src/main/java/com/test/mdl/platform/Patch.java在每次迭代中获取父级并与some/fake/path/.

如果路径不正确的话null被返回并且该模块没有被修补 https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java#l455。在这种情况下,该文件被视为属于未命名模块

三.路径存在,但两者都不包含module-info.java nor module-info.class

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

这工作正常。

原因是模块java.logging包含在运行时映像中,可以在模块查找期间找到。下一步是找到任一module-info.java or module-info.class https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ModuleFinder.java#l356在目录中。在这种情况下,它会失败,因为它不包含它,然后它会回退到查找module-info.class在成功的运行时映像中。

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

$ 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

这失败了。

之后module-info.java在指定的目录中找到--patch-module然后解析它并包含它的模块名称检查与中指定的名称是否相等--patch-module https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java#l324。在这种情况下,我们存在不匹配,因此会打印相关错误。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修补模块引发模块未找到错误 的相关文章

随机推荐