java - 修补模块引发模块未找到错误
问题描述
我使用 jdk 11 并尝试了解--patch-module
java 编译器的选项。这是我拥有的简单模块:
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 { }
我有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
文件):
二、
$ javac --patch-module com.test.mdl.platform=some/fake/path/ \
mdl-plarform/src/main/java/com/test/mdl/platform/Patch.java
那么为什么第一个示例失败,但目录存在并包含 valid module-info.java
,但第二个工作正常,即使路径不存在?
解决方案
我将留下一些关于如何javac
使用 option 的研究--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
应用常规模块路径扫描--patch-module
来查找在等式左侧指定的模块(com.test.mdl.platform
在这种特殊情况下)。
对于不在模块路径中的这个模块,它显然会失败并报告module not found
相关错误。该模块不在模块路径中,因此该行为是预期的。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
返回并且模块没有被修补。在这种情况下,该文件被视为属于未命名的模块
三、路径存在,但既不包含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.java
或module-info.class
查找。在这种情况下,它失败了,因为它不包含它,然后它回退到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
。在这种情况下,我们有一个不匹配,因此会打印相关的错误。
javac
我通过简单地使用常规 java 调试器进行调试来检查此行为。因此,这样做的唯一目的是解释问题中描述的案例中发生了什么。
推荐阅读
- rss - 使用 xmlUrl /Podcast Feed 值搜索播客
- javascript - 在节点 js 中调用方法时,返回的值是 [object Promise],因为控制台输出正在打印该值
- javascript - Firebase Cloud Functions - 如何反序列化 android Map 的地图
- php - 为什么我在来自服务器的 ajax 调用中得到额外的数据作为响应?
- blockchain - 如何追溯以太坊状态变量的历史?
- powershell - 将参数传递给 Powershells Call Operatore - 我无法让它工作
- android - 活动从和到一个位置在android中的转换
- java - 如何实现具有超时的 Runnable?
- reactjs - 在 TypeScript 项目之间共享代码(使用 React)?
- deno - 在 deno 中返回 HTML 作为响应