Ошибка JNDI Jetty в плагине Maven Jetty
Я пытаюсь настроить источник данных JNDI, который можно использовать при вызове подключаемого модуля Maven Jetty. Я пытаюсь сделать это внешним по отношению к файлу WAR, чтобы любому, кто позже сможет развернуть наше веб-приложение с Jetty, не пришлось редактировать файл конфигурации в каталоге WEB-INF WAR. Я создал файл jetty.xml следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<!-- Atomikos XA aware (but not XA capable) JDBC data source -->
<New id="sbeDataSource" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>jdbc/myDataSource</Arg>
<Arg>
<New class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean">
.......
</New>
</Arg>
</New>
</Configure>
Затем я ссылался на этот файл из плагина Maven следующим образом:
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<configuration>
<jettyConfig>config/jetty.xml</jettyConfig>
</configuration>
</plugin>
Однако, когда я пытаюсь запустить веб-приложение через mvn jetty: run-war, я получаю следующую ошибку:
Embedded error:
Object is not of type class org.mortbay.jetty.webapp.WebAppContext
Если я пропущу верхний уровень <Configure>
элемент и просто попробуйте создать новый ресурс JNDI напрямую через:
<New id="sbeDataSource" class="org.mortbay.jetty.plus.naming.Resource">
Тогда я получаю похожую ошибку:
Embedded error:
Object is not of type class org.mortbay.jetty.plus.naming.Resource
Что дает?
2 ответа
В дополнение к ответу Паскаля Тивента, ваш jetty.xml
на самом деле выглядит jetty-env.xml
, так что вы можете настроить maven-jetty-plugin для его использования с <jettyEnvXml>
:
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<configuration>
<jettyEnvXml>config/jetty.xml</jettyEnvXml>
</configuration>
</plugin>
Согласно документации, именование записей, заявленных в jetty.xml
должны быть jvm или серверная область:
Как вы можете видеть, наиболее естественными конфигурационными файлами, в которых можно объявлять записи именования каждой области действия, являются:
- jetty.xml - jvm или область сервера
- WEB-INF/jetty-env.xml или контекстный XML-файл - область веб-приложения
Так что ваши jetty.xml
должен содержать что-то вроде этого:
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure id="Server" class="org.mortbay.jetty.Server">
<!-- Atomikos XA aware (but not XA capable) JDBC data source -->
<New id="sbeDataSource" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>jdbc/myDataSource</Arg>
<Arg>
<New class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean">
.......
</New>
</Arg>
</New>
</Configure>