允许Eclipse识别标准库JDK11修补模块

时间:2019-01-11 10:01:33

标签: java eclipse java-11 eclipse-2018-12

出于好奇,我试图设置Eclipse以允许其编译和运行带有修补的标准库类的应用程序。

我有2个Java项目patchconsumer:一个包含字符串补丁程序类(具有新方法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 的定义不足):

enter image description here

所以我的问题是:

  • 如何配置Eclipse以使项目consumer正确地编译,运行并显示任何错误?
  • 如何配置Eclipse以在Content Assist上显示方法size()

我知道我需要使用Build Path -> Module Path -> Edit Is Modular -> Details Tab -> Patched module,但是我不知道如何配置两个项目。

一些您可能会发现有用的信息:

  • Eclipse 2018-12(4.10.0)构建ID:20181214-0600

感谢您的任何答复。

1 个答案:

答案 0 :(得分:1)

您使用的--patch-module并非其预期用途(JEP 261: Module System):

  

--patch-module选项仅用于测试和调试。   强烈建议不要在生产设置中使用它。

在您的方案中,您不修补现有方法,而是添加破坏系统库API的其他方法 Eclipse仅支持修补而不会破坏系统库的API 。我认为javac没有显示任何错误(很可能是由于缺少API不会被破坏而导致的检查失败)这一事实。

如果创建自己的JRE,则将其添加到 Window>首选项:Java>已安装的JRE 中,并确保在创建新的Java项目时不要选择执行环境JRE ,但您的特定JRE