Модуль Java не найден во время выполнения, даже если требуется транзитивный - PullRequest
0 голосов
/ 16 января 2019

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

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

...