出于好奇,我试图设置Eclipse以允许其编译和运行带有修补的标准库类的应用程序。
我有2个Java项目patch
和consumer
:一个包含字符串补丁程序类(具有新方法size()
,与length()
相同),另一个应包含使用上述方法size()
。设置如下:
- patch
- bin (contains class files)
- src
- java
- lang
- String.java
- consumer
- src
- consumer
- Main.java
- module-info.java
Main.java:
package consumer;
public class Main {
public static void main(String[] args) {
String s = new String("hello");
System.out.println(s.size());
}
}
编译patch
(从而在String.class
中放入patch/bin/java/lang/
之后),我知道我可以轻松使用:
java --patch-module java.base=patchpjt/bin/ consumer/src/consumer/Main.java
要正确地调用新添加的方法size()
,以获得5
的结果。
问题是在Eclipse方法size
中仍然无法识别(错误是方法大小()对于类型String 的定义不足):
所以我的问题是:
consumer
正确地编译,运行并显示任何错误?size()
?我知道我需要使用Build Path -> Module Path -> Edit Is Modular -> Details Tab -> Patched module
,但是我不知道如何配置两个项目。
一些您可能会发现有用的信息:
感谢您的任何答复。
答案 0 :(得分:1)
您使用的--patch-module
并非其预期用途(JEP 261: Module System):
--patch-module选项仅用于测试和调试。 强烈建议不要在生产设置中使用它。
在您的方案中,您不修补现有方法,而是添加破坏系统库API的其他方法。 Eclipse仅支持修补而不会破坏系统库的API 。我认为javac
没有显示任何错误(很可能是由于缺少API不会被破坏而导致的检查失败)这一事实。
如果创建自己的JRE,则将其添加到 Window>首选项:Java>已安装的JRE 中,并确保在创建新的Java项目时不要选择执行环境JRE ,但您的特定JRE 。