При переносе нашего проекта с модулей Java 8 на модули Java 11 у меня возникает вопрос, касающийся Java Module System (JPMS), особенно в отношении обязательной транзитивной директивы 1002 *. Предположим, у нас есть четыре простых проекта A, B, C и D со следующими объявлениями модулей в module-info.java :
Проект A
open module a {
exports a;
}
Проект B
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 файлах. Кроме того, каждый проект содержит файл класса со следующим содержанием (файлы для проектов 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 из-за примененного требует переходных директив. Но, как вы можете видеть, во время выполнения это не так, поскольку модуль 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 ) был добавлен в classpath и не к модулю-пути ? Это предполагаемое поведение, и что я должен изменить, чтобы запустить проект D в Eclipse?
Если я переместу C: \ me \ workspace \ a \ target \ classes в список аргументов -p , все будет работать так, как я ожидал, но это, безусловно, не самый предпочтительный способ идти.
Спасибо за любые подсказки.