При переносе нашего проекта с модулей 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, все будет работать так, как я и ожидал, но это определенно не предпочтительный способ идти.
Спасибо за любые подсказки.