LUWRAIN поддерживает механизм расширений, который позволяет гибко дополнять функциональность системы. Расширения LUWRAIN бывают двух типов:
Расширения (extensions) не следует путать с пакетами (packs). Эти термины тесно связаны, но выполняют разные функции. Расширение — это специальное понятие ядра LUWRAIN, которое служит задаче загрузке новых структур (приложений, команд и пр.). Пакеты, в свою очередь, явным образом ядром системы не воспринимаются, а являются набором файлов с дополнительной информацией и предназначены для доставки расширений на компьютер пользователя с удалённого узла. Другими словами, пакеты — это специально оформленные дистрибутивы, которые помогают в удобной форме загружать расширения со всеми необходимыми файлами и удалять их. Один пакет может содержать внутри несколько расширений, причём разных типов.
По способу загрузки расширения LUWRAIN делятся на две категории: доверенные расширения из состава дистрибутива и пользовательские расширения. Пользовательские расширения могут быть получены из непроверенных источников, поэтому для них добавляются дополнительные механизмы ограничения круга операций, которые они могут выполнять.
В дистрибутивах LUWRAIN присутствуют два каталога для раширений: jar
и lib
.
При запуске системы содержимое этих каталогов сканируется, и загружаются все файлы с расширением *.jar
.
Подразумевается, что в каталоге jar
находятся файлы, которые собраны из исходных текстов проекта,
а в lib
присутствуют сторонние библиотеки, полученные от других разработчиков в виде бинарных файлов.
Фактических различий в порядке обработки файлов между этими каталогами нет,
разделение существует сугубо только для удобства и по историческим причинам.
При обработке каждого файла с расширением *.jar
проверяется его манифест и присутствие секции org/luwrain
в нём.
Если в этой секции есть значение Extensions
, то предполагается, что оно содержит список классов, удовлетворяющих интерфейсу org.luwrain.core.Extension
, каждый из которых воспринимается как класс расширения для загрузки.
Если такое значение в манифесте отсутствует, то файл загружается просто как вспомогательная библиотека,
классы которой будут доступны другим библиотекам.
Пользовательские расширения сохраняются в каталоге extensions
в каталоге с пользовательскими данными LUWRAIN
(AppData\Roaming\Luwrain
в Microsoft Windows и .luwrain
в GNU/Linux в домашних каталогах).
Внутри каталога extensions
просматриваются все подкаталоги, и внутри каждого из них проверяется присутствие подкаталога jar
(т. е. )проверяются каталоги extensions/*/jar. Далее все файлы
*.jarзагружаются по тем же правилам, что и загрузка расширений из каталогов
jarи
libв дистрибутиве LUWRAIN, за исключением правила, что группа файлов внутри каждого пользовательского каталога
jar``` загружается со своим отдельным загрузчиком классов (class loader) (на будущее, пока эта возможность отключена)..
Подобное правило требуется для обеспечения контроля полномочий расширения и возможности "горячей" выгрузки расширения.