Ошибка 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>
Другие вопросы по тегам