Взаимодействие между модулями

Последнее обновление: 01.05.2018

Нередко разработчики определяют не один, а несколько модулей, которые используются в программе. И при взаимодействии модулей есть некоторые особенности, которые следует учитывать. Рассмотрим, как модули могут взаимодействовать друг с другом.

Определим проект со следующей структурой:

Взаимодействие модулей в Java 9

Здесь определено два модуля: 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 указывается папка, где находятся оба скомпилированных модуля. В итоге на консоль будет выведен факториал числа:

Модули в JDK 9
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850