我会留下一些关于如何进行的研究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 调试器。因此,这样做的唯一目的是解释问题中描述的案例中发生的情况。