我使用jdk 11并尝试理解java编译器的--patch-module选项。下面是我的简单模块:
mdl-platform
|
|
|___com.test.mdl.platform
| |
| |___ ...
| |
| |___Patch.java
|
|___module-info.javamodule-info.java
module com.test.mdl.plarform {
exports com.test.mdl.platform;
}Patch.java
public class Patch { }我有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文件):
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,但是第二个示例工作正常,甚至路径也不存在?
发布于 2019-07-31 21:48:12
我将留下一些关于javac如何使用选项--patch-module的研究。
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这是失败的。
Javac应用常规模块路径扫描来查找--patch-module等式左侧指定的模块(在这种情况下是com.test.mdl.platform)。
对于没有在模块路径中的模块,它明显失败,相关的module not found错误是已报告。模块com.test.mdl.platform不在模块路径中,因此需要该行为。
II.有效模块名和假路径
$ javac --patch-module com.test.mdl.platform=some/fake/path/ \
mdl-plarform/src/main/java/com/test/mdl/platform/Patch.java 这是"ok“。
原因是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和模块没有被修补。。在本例中,该文件被视为属于未命名模块。
路径存在,但既不包含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包含在运行时映像中,可以在模块查找过程中找到。下一步是在目录中进行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这是失败的。
在module-info.java在--patch-module中指定的目录中找到之后,它将被解析,并且它包含--patch-module的模块名。在这种情况下,我们有一个不匹配,所以相关的错误被打印出来。
我只是通过使用常规的java调试器调试javac来检查此行为。这样做的唯一目的是解释问题中所描述的案例中发生了什么。
https://stackoverflow.com/questions/57259605
复制相似问题