Разрешить Eclipse распознавать исправленный модуль стандартной библиотеки JDK11 - PullRequest
0 голосов
/ 11 января 2019

Просто из любопытства я пытаюсь настроить 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 все еще не распознается (ошибка Метод 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 голосов
/ 11 января 2019

Вы используете --patch-module, для которого оно не предназначено ( JEP 261: модульная система ):

Опция --patch-module предназначена только для тестирования и отладки. Его использование в производственных условиях настоятельно не рекомендуется.

В вашем сценарии вы не исправляете существующий метод, а добавляете дополнительный метод, который нарушает API системной библиотеки. Eclipse поддерживает только исправления, не нарушая API системной библиотеки. На мой взгляд, тот факт, что javac не показывает никаких ошибок (вероятно, из-за отсутствия проверок, если API не будет взломан), является ошибкой.

Если вы создаете свою собственную JRE, добавьте ее в Окно> Предпочтения: Java> Установленные JRE и убедитесь, что при создании нового проекта Java не выбирайте среду выполнения JRE , но ваш определенный JRE .

...