Сборка и развёртывание
В режиме liberty:dev сервер живёт внутри папки target. Для рабочей системы приложение нужно собрать в файл и развернуть. Есть два пути: отдать WAR на уже установленный сервер приложений — классический способ — или упаковать приложение вместе с сервером в один файл или образ, как принято для облака.
WAR-файл
./mvnw packageMaven соберёт 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.jarLaunching 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 Liberty | dropins/ или apps/ | server.xml |
| WildFly | standalone/deployments/ | standalone.xml или CLI |
| Payara, GlassFish | autodeploy/ или 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.