Как объявить модули в Java 9
Я хочу использовать java 9 модули в моем проекте. Я хочу поместить свои данные и классы обслуживания (в пакет с именем com.test.base
) в одном модуле с именем (Base), и поместите другие вещи, такие как основной класс и графический интерфейс (в пакете с именем com.test.main
) в другом модуле с именем (Main).
- Как объявить простой модуль (Base)?
- Как объявить модуль (Main) с зависимостью от (Base) модуля?
Я также хочу использовать (Base) модуль с отражением.
Предположим, мой корневой пакет
com.test
Так какую структуру каталогов я должен использовать для этих модулей?
1 ответ
Jigsaw quick-start - хорошее место для начала, чтобы помочь вам. Чтобы ответить на конкретные вопросы:
Как объявить простой модуль (Base)?
Создать класс с именем module-info.java
в com.test.base
каталог с определением как:
module base {
exports com.test.base;
}
Это экспортирует com.test.base
пакет.
Как объявить модуль (Main) с зависимостью от (Base) модуля?
То же, что и другой модуль base
класс с именем module-info.java
в com.test.main
каталог с определением как:
module main {
requires base;
}
Использует экспортированный пакет.
Я также хочу использовать (Base) модуль с отражением.
В зависимости от вашего использования, если API удален или изменен, как указано здесь, вы можете использовать --add-exports
Вариант Java, как подробно описано в JEP-261
Я также предложил бы прочитать ответ Николая на Как решить InaccessibleObjectException ("Невозможно сделать {член} доступным: модуль {A} не" открывает {пакет} "для {B}") на Java 9? для хорошего объяснения того, как использовать отражение в Java-9.
правильное решение - запустить JVM следующим образом:
--add-opens has the following syntax: {A}/{package}={B} java --add-opens java.base/java.lang=ALL-UNNAMED
Если отражающий код находится в именованном модуле, ALL-UNNAMED можно заменить его именем.
Предположим, мой корневой пакет com.test, так какую структуру каталогов я должен использовать для этих модулей?
Ваша структура каталогов должна быть примерно такой:
src/main/java
- com.test
- base
- module-info.java
- com/test/base/Main.java
- main
- module-info.java
- com/test/main/SimpleClass.java