Модуль не найден, если модуль B экспортируется с затмением и содержит другой модуль A - PullRequest
0 голосов
/ 21 ноября 2019

У меня проблема с затмением при экспорте JAR-файла проекта модуля B, который сам включает в себя другой модуль A, содержащийся в файле JAR. В этом случае, когда я пытаюсь импортировать экспортированный модуль, я получаю исключение java.lang.module.FindException.

В моем примере проект A является модульным проектом только с одним классом AClass:

package a;

public class AClass {
    public static void main(String[] args) {
        System.out.println("From module A");
    }
}

Информация о модуле проекта A:

module modulea {
    exports a;
}

Проект B также является модульным проектом, включающим экспорт в виде файла Jar проекта A. Он содержит только один класс BClass:

package b;

import a.AClass;

public class BClass {
    public static void main(String[] args) {
        AClass.main(args);
    }
}

Информация о модуле проекта B:

module moduleb {
    requires transitive modulea;

    exports b;
}

Когда я запускаю проект B, я получаю ожидаемый результат: Из модуля A

Проект Cтакже является модульным проектом, включающим экспорт в виде Jar-файла проекта B. Проект B экспортируется, как показано ниже:

enter image description here

и содержимоеФайл jar показан ниже:

enter image description here

Project C содержит только один класс CClass:

package c;

public class CClass {
    public static void main(String[] args) {
        System.out.println("ok");
    }
}

Информация о модулепроекта C:

module modulec {
    requires moduleb;
}

Когда я запускаю проект C, я получаю сообщение об ошибке:

Error occurred during initialization of boot layer
java.lang.module.FindException: Module modulea not found, required by moduleb

Я думаю, что проблемаЭто происходит из того, что проект C не находит модуль A, требуемый для модуля B, несмотря на то, что модуль A содержится в папке lib фляги проекта B. Но я не знаю, как решить проблему такого типа. Вопрос в том, как экспортировать в jar-файл модульный проект B, содержащий еще один модуль A с Eclipse?

Eclipse:

Version: 2019-09 R (4.13.0)
Build id: 20190917-1200

JVM:

openjdk version "13-BellSoft" 2019-09-17
OpenJDK Runtime Environment (build 13-BellSoft+33)
OpenJDK 64-Bit Server VM (build 13-BellSoft+33, mixed mode, sharing)

1 Ответ

0 голосов
/ 21 ноября 2019

В вашем случае B.jar содержит A.jar (модуль A плюс модуль B). Но Java Platform Module System (JPMS) допускает только один модуль на JAR , а не несколько модулей в одном JAR.

У вас есть следующие две опции:

  • Не включая A.jar в B.jar и в проекте C, используйте оба JAR-модуля, A.jar и B.jar через Modulepath
  • Не использовать JPMS путем удаления файла module-info.java в проекте C (в данном случае, включая A.jar в B.jar работах; если вы не используете jlink, то дополнительные усилия дляJPMS не приносит никакой пользы)
...