2.1. Решение#

Совокупность объектов сервера приложений, объединяющая в себе ресурсы, необходимые для выполнения прикладного кода решения.

Сервер приложений может запускать несколько решений одновременно. Количество решений ограничивается только объёмом потребляемой Java-машиной памяти и нагрузкой на ЦП.

2.1.1. Образ решения#

Структура каталогов на диске, содержащая: код, метаданные, библиотеки зависимостей и ресурсы прикладных модулей.

2.1.1.1. Иерархия загрузчиков классов#

Для каждого образа решения сервером создаётся иерархия загрузчиков классов.

CommonClassLoader
      ^
      |
EntityClassLoader
      ^
      |
SbtClassLoader

Note

До версии AS 1.22 ms7 родителем для SbtClassLoader являлся CommonClassLoader.

  • CommonClassLoader - загрузчик классов общих библиотек и низкоуровневых системных модулей (из подкаталогов с именами, начинающимися с ‘.’(точка)).

  • EntityClassLoader - загрузчик классов бизнес-сущностей (POJO), используемых инфраструктурой JPA (EclipseLink) при сериализации/десериализации объектов из/в БД.

  • SbtClassLoader - загрузчик классов прикладных модулей.

Note

Разделение кода решения на несколько загрузчиков классов реализовано для возможности частичной перезагрузки кода. В режиме разработки, когда код решения может изменяться разработчиком несколько раз за минуту, в большинстве случаев, нет необходимости перезагружать инфраструктуру ORM EclipseLink и общие библиотеки зависимостей.

2.1.1.2. Режимы загрузки классов#

Загрузка кода образа решения может производиться в двух режимах:

  • Эксплуатация (Jar)

  • Разработка (Dev)

2.1.1.2.1. Режим эксплуатации#

В промышленном режиме, решение загружает классы и ресурсы из структуры каталогов содержащей jar-файлы.

2.1.1.2.1.1. Структура каталогов образа решения#
{G3_HOME}
└── application
  └── FooProject
    ├── .commonlib
    | └── *.jar
    ├── .gtkjpa
    | └── gtkgpa-1.0.0.jar
    ├── btk
    | └── btk-1.0.0.jar
    ├── gtk
    | └── gtk-1.0.0.jar
    ├── bs
    | └── bs-1.0.0.jar
    └── solution.md5

Каждый подкаталог в {G3_HOME}/application/FooProject, кроме .commonlib, считается каталогом модуля.

При запуске решения, содержимое каталога {G3_HOME}/application/FooProject полностью копируется в каталог с уникальным авто-формируемым именем. Путь к корню каталогов указывается в xml-конфигурации сервера Configuration.Sbts.Sbt.binaryFolder.

Note

Копирование jar-файлов в каталог с уникальным именем необходимо для возможности горячей перезагрузки прикладного кода, после внесения изменений в код и формирования новых jar-файлов. Загрузчик классов блокирует jar-файлы на всё время своего существования, что мешает обновлению jar-файлов в текущем каталоге.

2.1.1.3. MD5-хэш сумма образа#

MD5-хэш сумма образа считывается сервером приложений из файла solution.md5. MD5-хэш, при наличии файла, выводится в информации о образах решений используемых сервером.

2.1.1.4. Блокировка дистрибутива образа#

Для установки блокировки необходимо создать файл solution.lock в каталоге с дистрибутивом образа решения.

Блокировка каталога с дистрибутивом образа необходима для предотвращения попыток загрузки образа сервером приложений, в момент обновления содержимого каталога. Перед началом копирования файлов из каталога с дистрибутивом в рабочий каталог, сервер приложений проверяет существование файл solution.lock. Если файл существует, сервер приложений выбрасывает исключение и прерывает загрузку образа.

2.1.1.4.1. Режим разработки#

В режиме разработки, решение загружает классы и ресурсы из структуры каталогов прикладного проекта в среде разработки IDEA. Это позволяет не выполнять дополнительных копирований бинарных файлов и не формировать jar-артефакты прикладных модулей, что сокращает время запуска отладки проекта и перезагрузки исполняемого кода, после правки и компиляции исходного кода.

2.1.1.4.1.1. Структура каталогов образа решения#
FooProject
└── application
  ├── build
  | └── lib
  |   ├── .commonlib
  |   | └── *.jar
  |   ├── .persistentLib
  |   | └── gtkgpa-1.0.0.jar
  |   └── appLib
  |     ├── btk-1.0.0.jar
  |     └── gtk-1.0.0.jar
  └── bs
    └── target
      └── scala-2.13
        └── classes

В CommonClassLoader загружаются:

  • build/lib/.commonlib/*.jar

  • build/lib/.persistentLib/*.jar

В SbtClassLoader загружаются:

  • build/lib/appLib/*.jar

  • bs/target/scala-2.13/classes

Note

В схеме, в качестве прикладного модуля, указан bs. В реальных проектах, подобных каталогов с кодом модулей неограниченное множество.

Changed in version 1.19.0_rc16: Появился подкаталог build/lib, в который переместился каталог общих библиотек .commonlib и добавились каталоги с предварительно скомпилированными jar-файлами прикладных модулей, от которых зависит код модулей проекта решения.

Attention

Если в проекте отсутствует каталог build/lib, производится попытка загрузки прикладного кода из каталогов с устаревшей структурой.

2.1.1.4.1.1.1. Устаревшая структура#
FooProject
└── application
  ├── .commonlib
  | └── *.jar
  ├── .gtkjpa
  | └── target
  |   └── scala-2.13
  |     └── classes
  ├── btk
  | └── target
  |   └── scala-2.13
  |     └── classes
  ├── gtk
  | └── target
  |   └── scala-2.13
  |     └── classes
  └── bs
    └── target
      └── scala-2.13
        └── classes

В CommonClassLoader загружаются:

  • .commonlib/*.jar

  • .gtkjpa/target/scala-2.13/classes

В SbtClassLoader загружаются:

  • btk/target/scala-2.13/classes

  • gtk/target/scala-2.13/classes

  • bs/target/scala-2.13/classes