Проект и запуск сервера
Приложение Jakarta EE — это обычный проект Maven, который собирается в WAR-файл (Web Application Archive): архив с классами и веб-страницами. WAR сам по себе не запускается — его разворачивают (deploy) на сервере приложений. Плагин liberty-maven-plugin делает это за нас: скачивает Open Liberty, кладёт туда WAR и запускает сервер.
Генератор проекта
У Open Liberty есть официальный генератор — сайт start.openliberty.io. В форме выберите Maven, Jakarta EE 11.0, MicroProfile 7.1 и Java 21. Тот же архив можно получить из терминала:
curl -o blog.zip "https://start.openliberty.io/api/start?a=blog&b=maven&e=11.0&g=com.example&j=21&m=7.1"
unzip blog.zip -d blog
cd blogВ папке появятся pom.xml, обёртка Maven mvnw и пример конфигурации сервера. Пакет для кода курса — com.example.blog.
Структура
| Путь | Что внутри |
|---|---|
pom.xml | Описание сборки и зависимостей |
src/main/java/com/example/blog/ | Java-код приложения |
src/main/resources/META-INF/ | Настройки: базы данных, MicroProfile Config |
src/main/webapp/ | Статические файлы и страницы Faces |
src/main/liberty/config/server.xml | Настройки сервера Open Liberty |
pom.xml
<!-- pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>blog</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.release>21</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>11.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.eclipse.microprofile</groupId>
<artifactId>microprofile</artifactId>
<version>7.1</version>
<type>pom</type>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>blog</finalName>
<plugins>
<plugin>
<groupId>io.openliberty.tools</groupId>
<artifactId>liberty-maven-plugin</artifactId>
<version>3.12.3</version>
</plugin>
</plugins>
</build>
</project>Главное здесь — <packaging>war</packaging> и зависимость jakarta.jakartaee-api со scope provided: API нужен для компиляции, а реализацию даст сервер, поэтому в WAR библиотека не попадает. finalName задаёт имя архива — target/blog.war.
server.xml
<!-- src/main/liberty/config/server.xml -->
<server description="Blog server">
<featureManager>
<feature>webProfile-11.0</feature>
<feature>microProfile-7.1</feature>
</featureManager>
<httpEndpoint id="defaultHttpEndpoint" host="*" httpPort="8080" httpsPort="8443" />
<webApplication contextRoot="/blog" location="blog.war" />
</server>В featureManager перечислены возможности сервера. webProfile-11.0 включает всё, что нужно курсу: сервлеты, REST, CDI, JPA, транзакции, Faces, безопасность. Генератор ставит полный jakartaee-11.0, но он тянет ещё и удалённые EJB, которые без настроенного реестра пользователей пишут в лог ошибку CWWKS9660E. Порт заменён на 8080, а contextRoot — начало адреса приложения: http://localhost:8080/blog/.
Первая страница и запуск
Создайте файл src/main/webapp/index.html с любым HTML, например заголовком «Блог». Затем запустите сервер в режиме разработки:
./mvnw liberty:devНа Windows — mvnw.cmd liberty:dev. Первый запуск скачивает сервер и занимает пару минут. Когда всё готово, в терминале появятся строки (вместо home-pc будет имя вашего компьютера):
[INFO] [AUDIT ] CWWKT0016I: Web application available (default_host): http://home-pc:8080/blog/
[INFO] [AUDIT ] CWWKF0011I: The defaultServer server is ready to run a smarter planet. The defaultServer server started in 12.920 seconds.
Откройте http://localhost:8080/blog/ — браузер покажет index.html. В режиме разработки сервер сам пересобирает и перезапускает приложение, когда вы сохраняете файл. Остановить его можно, набрав q и Enter.
| Команда | Что делает |
|---|---|
liberty:dev | Запуск с автоматической перезагрузкой |
liberty:run | Обычный запуск в терминале |
liberty:start / liberty:stop | Запуск в фоне и остановка |
Логи сервера лежат в target/liberty/wlp/usr/servers/defaultServer/logs/messages.log.
Частая ошибка
Открыть адрес без contextRoot, например http://localhost:8080/hello вместо http://localhost:8080/blog/hello. Сервер вернёт страницу Open Liberty «Context Root Not Found»: на этом пути нет ни одного приложения. Все адреса блога начинаются с /blog.