Модульная система платформы 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.

Смотрите также

Рекомендации

Внешние ссылки