Модульная система платформы Java - Java Platform Module System
Система модулей платформы Java определяет формат распространения для коллекций кода Java и связанных ресурсов. Он также определяет репозиторий для хранения этих коллекций или модулей и определяет, как они могут быть обнаружены, загружены и проверены на целостность. Он включает в себя такие функции, как пространства имен, с целью исправления некоторых недостатков в существующем формате JAR , особенно JAR Hell , которые могут привести к таким проблемам, как пути к классам и проблемы с загрузкой классов.
Система модулей Java изначально разрабатывалась в рамках процесса сообщества Java как JSR 277, и ее планировалось выпустить вместе с Java 7.
Позднее реализация JSR 277 была приостановлена, и был создан Project Jigsaw для модульного построения JDK. Этот JSR был заменен JSR 376 (модульная система платформы Java).
Первоначально Project Jigsaw предназначался для Java 7 (2011 г.), но был перенесен на Java 8 (2014 г.) как часть плана B и снова отложен до выпуска Java 9 в 2017 г. Java 9, включая систему модулей Java, была выпущена 21 сентября, 2017 г.
Архитектура
Система модулей Java, реализованная в Java 9, включает следующие JEP и JSR (запрос спецификации Java) :
- JEP 200: Модульный JDK: определение модульной структуры для JDK
- JEP 201: Модульный исходный код: реорганизовать исходный код JDK в модули, улучшить систему сборки для компиляции модулей и обеспечить соблюдение границ модулей во время сборки.
- JEP 220: Модульные образы времени выполнения: реструктуризация образов времени выполнения JDK и JRE для размещения модулей и повышения производительности, безопасности и удобства обслуживания.
- JEP 261: Модульная система: реализация модульной системы платформы Java
- JEP 282: Java Linker: создание инструмента, который может собирать и оптимизировать набор модулей и их зависимости в настраиваемый образ времени выполнения.
- JSR 376: Модульная система платформы Java
Кроме того, было добавлено несколько других функций JDK 9 для облегчения перехода к модульной системе:
- JEP 238: файлы JAR с несколькими выпусками: расширение формата файла JAR, чтобы несколько версий файлов классов для конкретных версий Java могли сосуществовать в одном архиве.
- JEP 253: Подготовка элементов управления пользовательского интерфейса JavaFX и API-интерфейсов CSS для модуляции: определение общедоступных API-интерфейсов для функций JavaFX, которые в настоящее время доступны только через внутренние API-интерфейсы и станут недоступными из-за модульности.
- JEP 260: инкапсулировать большинство внутренних API-интерфейсов: сделать большинство внутренних API-интерфейсов JDK недоступными по умолчанию, но оставить доступными несколько важных, широко используемых внутренних API-интерфейсов до тех пор, пока не появятся поддерживаемые замены для всех или большей части их функций.
- JEP 275: Модульная упаковка приложений Java: Упаковщик Java будет развиваться для JDK 9, делая его осведомленным о модулях, позволяя, например, упаковать модуль и все модули, от которых он зависит.
Свойства модулей
Модули - это новый способ группировки кода. В отличие от файлов Jar , модули явно объявляют, от каких модулей они зависят и какие пакеты экспортируют. Явные объявления зависимостей улучшают целостность кода, упрощая рассуждения о больших приложениях и зависимостях между программными компонентами.
Например, следующее объявление модуля объявляет, что модуль com.foo.bar зависит от другого модуля com.foo.baz , и экспортирует следующие пакеты: com.foo.bar.alpha и com.foo.bar.beta :
module com.foo.bar {
requires com.foo.baz;
exports com.foo.bar.alpha;
exports com.foo.bar.beta;
}
Общественные члены com.foo.bar.alpha и com.foo.bar.beta пакетов будут доступны зависимыми модулями. Частные члены недоступны даже с помощью таких средств, как отражение , хотя, разрешен ли де-факто «незаконный доступ», зависит от настройки командной строки.
В отличие от формата файла Jar, модуль будет описывать эти зависимости в объявлении модуля, которое будет помещено в файл с именем module-info.java в корне иерархии исходных файлов модуля. JDK сможет проверять зависимости и взаимодействия между модулями как во время компиляции, так и во время выполнения. Сам JDK был модульным в Java 9 .
Ссылки с OSGi
Система модулей Java не предназначена для поддержки всех функций, которые в настоящее время поддерживает платформа OSGi (например, модель жизненного цикла и реестр служб). Однако система модулей Java будет поддерживать функции, которые не поддерживаются OSGi, такие как модульность во время компиляции и встроенная поддержка собственных библиотек. В 2016 году было опубликовано несколько статей, в которых изучается, как система модулей Java и OSGi могут взаимодействовать друг с другом. Их можно найти в InfoQ, а также в блоге OSGi Alliance.