Система модулей платформы Java
Система модулей платформы Java [1] определяет формат распространения коллекций кода Java и связанных ресурсов. Он также определяет репозиторий для хранения этих коллекций или модулей и определяет, как их можно обнаружить, загрузить и проверить на целостность. Он включает в себя такие функции, как пространства имен, с целью исправления некоторых недостатков существующего формата JAR , особенно JAR Hell , который может привести к таким проблемам, как путь к классам и проблемы с загрузкой классов.
Система модулей Java изначально разрабатывалась в рамках процесса сообщества Java как JSR 277, и ее планировалось выпустить вместе с Java 7.
Позже выпуск JSR 277 был приостановлен, а проект Jigsaw [2] был создан для модульности JDK. Этот JSR был заменен JSR 376 (система модулей платформы Java).
Project Jigsaw изначально предназначался для Java 7 (2011 г.), но был перенесен на Java 8 (2014 г.) как часть Плана Б. [3] и снова отложено до выпуска Java 9 в 2017 году. [4] Java 9, включая систему модулей Java, была выпущена 21 сентября 2017 года. [5]
Архитектура
[ редактировать ]Система модулей Java, реализованная в Java 9, включает следующие JEP и JSR (запрос спецификации Java) : [2]
- JEP 200: Модульный JDK: определение модульной структуры для JDK.
- JEP 201: Модульный исходный код: реорганизуйте исходный код JDK в модули, улучшите систему сборки для компиляции модулей и установите границы модулей во время сборки.
- JEP 220: Модульные образы времени выполнения: реструктуризация образов времени выполнения JDK и JRE для размещения модулей и повышения производительности, безопасности и удобства обслуживания.
- JEP 261: Система модулей: реализация системы модулей платформы Java.
- JEP 282: Java Linker: создайте инструмент, который может собирать и оптимизировать набор модулей и их зависимостей в пользовательский образ времени выполнения. [6]
- JSR 376: Система модулей платформы Java [7]
Кроме того, для облегчения перехода на модульную систему было добавлено несколько других функций JDK 9:
- JEP 238: Файлы JAR с несколькими выпусками: Расширьте формат файла JAR, чтобы позволить нескольким версиям файлов классов, специфичным для версии Java, сосуществовать в одном архиве. [8]
- JEP 253: Подготовка элементов управления пользовательского интерфейса JavaFX и API-интерфейсов CSS для модульности: Определите общедоступные API для функций JavaFX, которые в настоящее время доступны только через внутренние API и станут недоступными из-за модульности. [9]
- JEP 260: Инкапсулируйте большинство внутренних API: сделайте большинство внутренних API JDK недоступными по умолчанию, но оставьте доступными несколько критически важных, широко используемых внутренних API, пока не появятся поддерживаемые замены для всех или большей части их функций. [10]
- JEP 275: Модульная упаковка приложений Java. Упаковщик Java будет развиваться для JDK 9, информируя его о модулях, позволяя, например, упаковывать модуль и все модули, от которых он зависит. [11]
Свойства модулей
[ редактировать ]Модули — это новый способ группировки кода. В отличие от файлов Jar , модули явно указывают, от каких модулей они зависят и какие пакеты они экспортируют. [12] Явные объявления зависимостей улучшают целостность кода, упрощая понимание больших приложений и зависимостей между программными компонентами.
Объявление модуля помещается в файл с именем Module-info.java в корне иерархии исходных файлов модуля. JDK будет проверять зависимости и взаимодействия между модулями как во время компиляции, так и во время выполнения.
Например, следующее объявление модуля объявляет, что модуль 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 будут доступны зависимым модулям. Частные члены недоступны даже с помощью таких средств, как отражение . Обратите внимание, что в версиях Java разрешение такого «незаконного доступа» с 9 по 16 фактическое зависит от настройки командной строки. [13]
был модульным Сам JDK в Java 9 . [14]
Ссылки с OSGi
[ редактировать ]Система модулей Java не предназначена для поддержки всех функций, которые в настоящее время поддерживает платформа OSGi (например, модель жизненного цикла и реестр служб). Однако система модулей Java будет поддерживать функции, которые не поддерживаются OSGi, такие как модульность во время компиляции и встроенная поддержка собственных библиотек. [15] В 2016 году было опубликовано несколько статей, посвященных взаимодействию Java Module System и OSGi. Их можно найти на InfoQ. [16] а также блог OSGi Alliance. [17]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Система модулей платформы Java (JSR 376)» . Корпорация Оракл . Проверено 2 июля 2018 г.
- ^ Перейти обратно: а б «Проект Головоломка» . Корпорация Оракл . Проверено 29 ноября 2015 г.
- ^ Марк Рейнхольд (20 сентября 2009 г.). «Пришло время… плана Б» . Корпорация Оракл . Проверено 21 июня 2017 г.
- ^ «ДжДК 9» . Корпорация Оракл . Проверено 24 февраля 2016 г.
- ^ «Java 9: дата выпуска и новые возможности» . techworld.com. 21 июля 2017 г. Проверено 18 ноября 2017 г.
- ^ «jlink: Java Linker (JSR 282)» . Корпорация Оракл . Проверено 12 марта 2016 г.
- ^ «Система модулей платформы Java (JSR 376)» . Корпорация Оракл . Проверено 29 ноября 2015 г.
- ^ «JEP 238: Файлы JAR с несколькими выпусками» . Корпорация Оракл . Проверено 31 июля 2017 г.
- ^ «JEP 253: Подготовка элементов управления пользовательского интерфейса JavaFX и API-интерфейсов CSS для модуляризации» . Корпорация Оракл . Проверено 31 июля 2017 г.
- ^ «JEP 260: инкапсулировать большинство внутренних API» . Корпорация Оракл . Проверено 31 июля 2017 г.
- ^ «JEP 275: Модульная упаковка приложений Java» . Корпорация Оракл . Проверено 31 июля 2017 г.
- ^ Марк Рейнхольд (08 марта 2016 г.). «Состояние модульной системы» . Корпорация Оракл . Проверено 18 февраля 2017 г.
- ^ «JEP 396: строгая инкапсуляция внутренних компонентов JDK по умолчанию» . Проверено 6 февраля 2021 г.
- ^ «Сводка модуля JDK» . Корпорация Оракл . 24 июня 2016 г. Архивировано из оригинала 8 декабря 2015 г. Проверено 18 февраля 2017 г.
- ^ Марк Рейнхольд (24 августа 2012 г.). «Проект Пазл: Опоздание на поезд: Вопросы и ответы» . Корпорация Оракл . Проверено 29 ноября 2015 г.
- ^ «Java 9, OSGi и будущее модульности» . ИнфоQ . Проверено 26 сентября 2016 г.
- ^ «Слои модулей Java и пакеты OSGi» . OSGi Альянс . Проверено 1 августа 2016 г.