首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修补模块引发模块找不到错误

修补模块引发模块找不到错误
EN

Stack Overflow用户
提问于 2019-07-29 18:32:30
回答 1查看 1.2K关注 0票数 6

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

代码语言:javascript
复制
mdl-platform
      |
      |
      |___com.test.mdl.platform
      |            |
      |            |___ ...
      |            |
      |            |___Patch.java
      |
      |___module-info.java

module-info.java

代码语言:javascript
复制
module com.test.mdl.plarform {
    exports com.test.mdl.platform;
}

Patch.java

代码语言:javascript
复制
public class Patch { }

我有Patch.java文件,并想用它对模块进行修补。我试过:

I.

代码语言:javascript
复制
$ 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.

代码语言:javascript
复制
$ javac --patch-module com.test.mdl.platform=some/fake/path/ \
      mdl-plarform/src/main/java/com/test/mdl/platform/Patch.java 

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-31 21:48:12

我将留下一些关于javac如何使用选项--patch-module的研究。

I.有效的补丁模块路径和模块名,它不在模块路径

代码语言:javascript
复制
$ 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.有效模块名和假路径

代码语言:javascript
复制
$ 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,也不包含

代码语言:javascript
复制
$ 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.有效的模块名称和模块路径,但模块名称不匹配

代码语言:javascript
复制
$ 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来检查此行为。这样做的唯一目的是解释问题中所描述的案例中发生了什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57259605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档