Как объявить модули в 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
Другие вопросы по тегам