Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Сборка и развёртывание

В режиме liberty:dev сервер живёт внутри папки target. Для рабочей системы приложение нужно собрать в файл и развернуть. Есть два пути: отдать WAR на уже установленный сервер приложений — классический способ — или упаковать приложение вместе с сервером в один файл или образ, как принято для облака.

WAR-файл

./mvnw package

Maven соберёт target/blog.war. В нём только ваш код и ресурсы — около 40 КБ, потому что реализации всех спецификаций есть на сервере.

Внутри WARЧто это
WEB-INF/classes/Скомпилированные классы и META-INF/persistence.xml
WEB-INF/lib/Сторонние библиотеки, если они есть
index.html, posts.xhtmlФайлы из src/main/webapp

Установленный сервер

На отдельно установленном Open Liberty есть два способа развернуть WAR:

СпособКак
Папка dropinsСкопировать WAR в usr/servers/defaultServer/dropins/ — сервер подхватит его сам, корень адреса возьмёт из имени файла
server.xmlПоложить WAR в apps/ и описать <webApplication contextRoot="/blog" location="blog.war" />

Второй способ лучше: в server.xml видно, что и с какими настройками развёрнуто. Туда же переносятся featureManager, источник данных и библиотека с драйвером из нашего src/main/liberty/config/server.xml.

Исполняемый JAR

Плагин Liberty умеет упаковать сервер, настройки и приложение в один JAR:

./mvnw package liberty:create liberty:install-feature liberty:deploy liberty:package -Dinclude=runnable
[INFO] CWWKM2136I: Package file location is ...\blog\target\blog.jar.
[INFO] BUILD SUCCESS

Такой файл запускается на любой машине с Java 21 или новее:

java -jar target/blog.jar
Launching defaultServer (Open Liberty 26.0.0.9/wlp-1.0.117.cl260920260824-0859) on OpenJDK 64-Bit Server VM, version 25.0.4.1+1-LTS
[AUDIT   ] CWWKT0016I: Web application available (default_host): http://home-pc:8080/blog/
[AUDIT   ] CWWKF0011I: The defaultServer server is ready to run a smarter planet. The defaultServer server started in 18.206 seconds.

Вывод сокращён. При запуске JAR распаковывает сервер во временную папку и стартует его. Внутри только включённые функции сервера: у блога файл весит около 100 МБ.

В режиме liberty:dev пароли хранилища ключей сервер берёт из сгенерированного файла server.env. В исполняемом JAR вход у нас не заработал: в логе было CWWKS4118E: LTPA configuration error. A keysPassword attribute is not configured on the <ltpa /> element, а запросы с паролем получали Error 403: AuthenticationFailed. Если в приложении есть Jakarta Security, задайте пароли явно в server.xml:

<!-- src/main/liberty/config/server.xml (фрагмент) -->
<keyStore id="defaultKeyStore" password="changeme" />
<ltpa keysPassword="changeme" />

В рабочей системе вместо changeme подставьте переменную окружения: password="${env.KEYSTORE_PASSWORD}".

Docker

Генератор Open Liberty положил в проект Dockerfile:

FROM icr.io/appcafe/open-liberty:kernel-slim-java21-openj9-ubi-minimal
 
COPY --chown=1001:0 /src/main/liberty/config /config
 
RUN features.sh
 
COPY --chown=1001:0 target/*.war /config/apps
 
RUN configure.sh

Образ берёт минимальный Liberty, копирует server.xml, устанавливает нужные функции и добавляет WAR. Драйвер H2 тоже нужно положить в образ — в папку, которую указывает library в server.xml.

Другие серверы

WAR переносим: тот же файл разворачивается на WildFly, Payara или GlassFish. Отличаются только настройки самого сервера.

СерверКуда положить WARГде настраивается источник данных
Open Libertydropins/ или apps/server.xml
WildFlystandalone/deployments/standalone.xml или CLI
Payara, GlassFishautodeploy/ или asadmin deployКонсоль или asadmin

Имя jdbc/blog из persistence.xml нужно создать на каждом сервере его способом — код приложения при этом не меняется.

Частая ошибка

Запустить второй экземпляр сервера, пока первый (например, liberty:dev в соседнем терминале) ещё работает. Приложение формально стартует, но порт занят, и в лог попадает:

[ERROR   ] CWWKO0221E: TCP Channel defaultHttpEndpoint initialization did not succeed.  The socket bind did not succeed for host * and port 8080.  The port might already be in use.  Exception Message: Address already in use: bind

Остановите первый сервер (q в liberty:dev или ./mvnw liberty:stop) или задайте другой httpPort в server.xml.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.