вівторок, 23 жовтня 2007 р.

Суперпакеты и Джава Модуль

JSR 294 Improved Modularity Support (superpackages)

Улучшенная поддержка модульности – суперпакеты

Позволяет объединять пакеты в суперпакеты и управлять доступом к ним (в основном для «скрытия деталей реализации»). Позволяет осуществлять доступ только к опубликованным API. Это предотвращает возможность потребителя зависеть от внутренних деталей и позволяет изменять некоторые аспекты реализации без затрагивания потребителей.

В Джаве есть механизмы для регулирования доступа – но они ориентированы на использование в рамках 1 пакета. Когда большой проект состоит из нескольких пакетов то регулировать доступ только для внешних систем или только остальных для внутренних пакетов невозможно.

Суперпакеты будут встроены как в компилятор (javac) так и в виртуальную машину Джава.

superpackage example.bar.lib {     
// member packages
member package example.bar.lib;
// member superpackages
member superpackage example.bar.lib.net, example.bar.lib.xml;
// list of exported types
export example.bar.lib.Table;
export superpackage example.bar.lib.net;
}


JSR 277 Java Module System


Недостатки JAR:

Поддержка версий в JAR файлах служит для определения зависимостей от расширейний Джава (опциональных пакетов), но не версии самого Jar файла. Также нет надежного механизма для выражения, получения зависимостей одного JAR файла от другого. Ссылаясь на JAR файл, кроме всего прочего, необходимо указать его в classpath. Если путь к JAR файлу может изменится во время распространения конечному пользователю, разработчикам необходимо исправлять все эти ссылки для JAR файлов как части установочного процесса.

Разработчики также нашли что достаточно тяжело распространять Джава расширения из-за того что легко могут возникнуть проблемы с определением версий и коллизий области видимости (namespace). Джава расширения на данный момент могут устанавливатся только на указанную JRE; невозможно организовать так чтобы установленное расширение разделялось несколькими JRE.

Все эти недостатки призван исправить JAM.

Спецификация определяет формат распространения и репозиторий для коллекций Джава кода и соответствующих ресурсов. Также определяет механизмы нахождения, загрузки и интеграции во время выполнения. Определяет новый архив развертывания называемый JAM (Java Module). Java Module это JAR файл который содержит другие JARы, ресурсы и метаданные. JAM может специфицировать какие части модуля публичные (public) а какие скрытые (hidden). JAMы может специфицировать зависимости от других модулей.

Архитектура:

  1. Формат распространения (Джава модуль) и его метаданные как единица доставки – для упаковки коллекций Джава классов и связанных ресурсов. Метаданные содержат информацию о модуле, классах и ресурсах которые находятся в модуле, и зависимости от других модулей. Метаданные также содержат список всех экспортируемых элементов для защиты классов и ресурсов от того чтобы они были использованы за пределами модуля не по назначению;

  2. Схема версий которая определяет как модуль определяет как свою собственную версию так и версию зависимостей от других модулей;

  3. Репозиторий для хранения, поиска и получения модулей с поддержкой версионности и изолированности.

  4. Поддержка времени выполнения в загрузчике приложения и загрузчике классов поиска, загрузки и проверки целостности модулей.

Пример:

  1. Запуск модулей используя Java launcher

//Запустить найстаршую версию com.wombat.webservice

java -module com.wombat.webservice

//Запустить com.wombat.webservice версии 1.2.0 или старше

    java -module com.wombat.webservice:1.2.0+

  1. Импортировать пользовательский модуль

ImportModule(com.sun.java2d, @VersionConstraint(”1.7.0”))

  1. Пример модуля

@Version(“1.0”) // module annotation

super package com.wombat.webservice { // module name

// импорт модуля не ниже версии 1.0

@VersionConstraint(“1.0+”)

import org.foo.xml;

.....

}

Немає коментарів: