Нередко разработчики определяют не один, а несколько модулей, которые используются в программе. И при взаимодействии модулей есть некоторые особенности, которые следует учитывать. Рассмотрим, как модули могут взаимодействовать друг с другом.
Определим проект со следующей структурой:
Здесь определено два модуля: demo и operations.
В папке operations/com/metanit/factorial определен следующий файл Factorial.java:
package com.metanit.factorial; public class Factorial{ public static int calculate(int n){ if (n < 0) return -1; int result = 1; for(int i =1; i <= n; i++){ result = result * i; } return result; } }
Класс Factorial определяет функцию вычисления факториала и принадлежит пакету com.metanit.factorial.
Допустим, мы хотим, чтобы данный класс мог быть использован в других модулях. Но по умолчанию, все пакеты модуля невидимы для модулей извне. Чтобы сделать пакет, который определен в модуле, видимым для других модулей, этот пакет надо экспортировать при определении модуля с помощью оператора exports.
Для этого в папке operations определен следующий файл module-info.java:
module operations { exports com.metanit.factorial; }
Файл указывает, что данный модуль будет называться operations. С помощью оператора exports экспортируется
пакет com.metanit.factorial
. Таким образом, другие модули смогут использовать класс Factorial.
Теперь перейдем к модулю demo. В папке demo определен следующий файл module-info.java:
module demo { requires operations; }
С помощью оператора requires< указываем, что модуль demo будет использовать модуль operations.
А в папке demo/com/metanit/hello/ определим следующий файл Hello.java:
package com.metanit.hello; import com.metanit.factorial.Factorial; public class Hello{ public static void main(String[] args){ int a = 5; int b = Factorial.calculate(a); System.out.printf("Factorial of %d is equal to %d \n", a, b); } }
Здесь мы подключаем класс Factorial из пакета com.metanit/factorial и вычисляем факториал числа.
Скомпилируем первый модуль - operations:
javac -d appmodules/operations operations/module-info.java operations/com/metanit/factorial/Factorial.java
С помощью параметра -d здесь указываем, что скомпилированный модуль будет помещаться в каталог appmodules/operations (если по умолчанию такого каталога нет, то он будет автоматически будет создан).
Скомпилируем второй модуль - demo, который использует первый модуль:
javac -p appmodules -d appmodules/demo demo/module-info.java demo/com/metanit/hello/Hello.java
Параметр -p представляет сокращение от --module-path и указывает, где искать используемые модули. То есть в данном случае это папка appmodules, куда ранее был помещен скомпилированный модуль operations.
Параметр -d, как и в случае выше, указывает, куда будет помещаться скомпилированный модуль - то есть в папку appmodules/demo.
После того, как все скомпилировано, запустим на выполнение модуль demo:
java -p appmodules -m demo/com.metanit.hello.Hello
При компиляции с помощью параметра -p указывается папка, где находятся оба скомпилированных модуля. В итоге на консоль будет выведен факториал числа: