Модуль Java не найден во время выполнения, даже если требуется транзитивность

При переносе нашего проекта с модулей Java 8 на модули Java 11 у меня возник вопрос, касающийся системы модулей Java (JPMS), особенно директивы required Transive. Предположим, у нас есть четыре простых проекта A, B, C и D со следующими объявлениями модулей в module-info.java:

Проект А

open module a {
    exports a;
}

Проект Б

open module b {
    exports b;
    requires transitive a;
}

Проект C

open module c {
    exports c;
    requires transitive b;
}

Проект D

open module d {
    requires transitive c;
}

Используя Maven, мы объявили зависимости D зависит от C, C зависит от B и B зависит от A в соответствующих файлах pom.xml. Кроме того, каждый проект содержит class-файл следующего содержания (файлы для проектов A, B и C эквивалентны):

package d;
public class D {
    public static void main(String[] args) { 
        System.out.println("D");
    }
}

При запуске классов с использованием конфигурации среды выполнения Eclipse 2018-12 по умолчанию без ошибок запускаются только классы A, B и C. Но когда я запускаю класс D, я получаю: Произошла ошибка при инициализации загрузочного слоя java.lang.module.FindException: модуль a не найден, требуется b

В моем понимании модуль a должен быть известен модулю b, модулю c, а также модулю d из-за примененного < em>требуются транзитивные директивы. Но, как видите, во время выполнения это не так, поскольку модуль a не установлен в путь к модулю (-p), а в classpath сгенерированной командной строки:

C:\me\jdk-11.0.1\bin\javaw.exe
-Dfile.encoding=UTF-8 
-p "C:\me\workspace\d\target\classes;C:\me\workspace\c\target\classes;C:\me\workspace\b\target\classes"
-classpath "C:\me\workspace\a\target\classes"
-m d/d.D

Итак, мой вопрос: почему проект A (C:\me\workspace\a\target\classes) был добавлен в путь к классам и не в путь к модулю? Это предполагаемое поведение, и что мне нужно изменить, чтобы запустить проект D в Eclipse?

Если я перемещу C:\me\workspace\a\target\classes в список аргументов -p, все будет работать так, как я и ожидал, но это определенно не предпочтительный способ идти.

Спасибо за любые подсказки.


person user27772    schedule 16.01.2019    source источник
comment
Выбирает ли проект d, в Project › Properties: Java Build Path, вкладка Projects перемещает проект a из Classpath в Modulepath решить вашу проблему?   -  person howlger    schedule 16.01.2019
comment
@howlger: Нет, не было (кстати, на этой вкладке не отображались ни пути к классам, ни пути к модулям, поэтому мне пришлось не перемещаться, а добавить новую запись для проекта a). Но если я добавлю модуль a в свою конфигурацию запуска › Зависимости › Записи Modulepath, он работает. Между тем я также обнаружил, что когда я добавляю requires a в модуль c или модуль d, он также будет работать. На данный момент это обходной путь, с которым мы можем жить, но на самом деле я хочу понять, почему моих директив required transient недостаточно для добавления всех необходимых модулей в module-path при запуске класса D.   -  person user27772    schedule 16.01.2019
comment
Я подал отчет об ошибке здесь: bugs.eclipse.org/bugs/show_bug.cgi ?id=543766   -  person user27772    schedule 24.01.2019
comment
Ну, тогда вы можете дать себе ответ. Голосуйте и комментируйте ошибку, если хотите, чтобы она была исправлена.   -  person howlger    schedule 24.01.2019