Джетти-ОКР.xml с источником данных приводит к сбою WebAppContext на причале mvn: run

у меня есть очень простой проект webapp с maven и jetty, который работает очень хорошо до сих пор. Но теперь мне нужно настроить пул соединений MySQL с JNDI, поскольку соединения с базой данных всегда тайм-аут.

прежде всего здесь соответствующее содержание моего пом.XML-код:

<modelVersion>4.0.0</modelVersion>
...
<packaging>war</packaging>
...
<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jetty-version>8.1.0.v20120127</jetty-version>
</properties> 
<dependencies>
    ...
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.20</version>
    </dependency>
    <dependency>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${jetty-version}</version>
        <type>maven-plugin</type>
    </dependency>
</dependencies>
...
<build>
    <plugins>
    <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${jetty-version}</version>
        <configuration>
                <scanIntervalSeconds>10</scanIntervalSeconds>
            </configuration>
        </plugin>
    </plugins>
    ...
</build>

теперь я создал причал.xml в папке / src / main / webapp / WEB-INF со следующим содержимым:

<Configure class="org.eclipse.jetty.webapp.WebAppContext">  
    <New id="project-db" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg>jdbc/db</Arg>
        <Arg>
            <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
                <Set name="url">jdbc:mysql://www.example.com:3306/mydb</Set>
                <Set name="username">dbuser</Set>
                <Set name="password">dbpass</Set>
            </New>
        </Arg>
    </New>
</Configure>

но проблема в том, что я даже не могу проверить, если это соединение работает, поскольку плагин jetty-maven не запускается на цели

mvn jetty:run

следующая ошибка:

WARN:oejw.WebAppContext:Failed startup of context o.m.j.p.JettyWebAppContext
{/,file:/D:/documents/programmierung/workspace/battleships-trunk/src/main/webapp/}
,file:/D:/documents/programmierung/workspace/battleships-trunk/src/main/webapp/

java.lang.IllegalArgumentException: Object of class 
'org.mortbay.jetty.plugin.JettyWebAppContext' is not of type 
'org.eclipse.jetty.webapp.WebAppContext'. 
Object Class and type Class are from different loaders.

Итак, как я могу заставить это работать? Я вынужден использовать Jetty версии 8.x как мне нужна поддержка WebSocket и как удаленный производительный сервер будет работать причал 8.

редактировать Перед ответом Павла Веллера я попробовал следующее: развернул собранную войну на удаленный сервер jetty8 и получил ту же ошибку, что и предыдущая ошибка теперь гласит следующее:

java.lang.IllegalArgumentException: Object of class 
'org.eclipse.jetty.webapp.WebAppContext' is not of type 
'org.eclipse.jetty.webapp.WebAppContext'. 
Object Class and type Class are from different loaders.

таким образом, кажется, что существует несколько конфликтующих загрузчиков классов.

EDIT2 По просьбе Павла я воссоздал ошибку с упрощенным webapp, который вы можете найти здесь на Dropbox. Это проект zipped eclipse maven.

5 ответов


Попробуйте удалить зависимость jetty-maven-plugin- эта зависимость добавляет плагин к войне, которую вы не хотите.

Если вам нужно использовать какие-либо классы из самой пристани, добавьте зависимость для конкретной версии пристани (а не плагина) с областью provided.


похоже, что он тянет причал 6 откуда-то. Исключение, которое вы видите, похоже, исходит из кода, который анализирует jetty-env.xml (org.mortbay.jetty.plus.webapp.EnvConfiguration). The XMLConfiguration класс сравнивает класс, который вы объявляете на Configure элемент с фактическим классом того, что он получает от getWebAappContext(). Последнее instance of org.mortbay.jetty.plugin.JettyWebAppContext в вашем случае, и вы ожидаете, что это будет org.eclipse.jetty.webapp.WebAppContext (который будет родительским классом для JettyWebAppContext если бы они оба пришли из одного и того же"пространства имен").

трудно сказать, где это будет происходить, но, возможно, проверить ваш .m2 и подтвердить правильной программы для вашей зависимости пристани? Он должен работать не в той версии, которую вы ожидаете от него.

обновление. Jetty делает следующее При загрузке классов, определенных в конфигурации:

  1. первая загрузка с Thread.currentThread().getContextClassLoader() и петля через все getParent() пока все варианты не будут исчерпаны.
  2. если не удалось, попробуйте загрузить с помощью загрузчик классов, который загружен классы jetty core (XmlConfiguration.class.getClassLoader()) и через всех родителей тоже.
  3. если все еще не удалось, сделайте Class.forName()
  4. отчет ClassNotFoundException если не успешным.

вы можете увидеть его в коде org.mortbay.util.Loader(http://grepcode.com это отличный ресурс для быстрого взгляда под капот)

он загружает класс в вашем случае, но, по-видимому, не с право класс погрузчик.

теперь я бы предположил, что у вас есть дополнительный причал фляги в classpath


была такая же проблема, вызванная:

<useTestClasspath>true</useTestClasspath> (true instead of false)

это поставило дополнительную банку jetty в путь к классам...


включая область зависимостей решил ошибку для меня.

<scope>provided</scope>

на pom.xml это выглядит так,

<!-- JETTY DEPENDENCIES -->
<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-server</artifactId>
  <version>${jetty.version}</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-servlet</artifactId>
  <version>${jetty.version}</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-webapp</artifactId>
  <version>${jetty.version}</version>
  <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-servlets</artifactId>
    <version>${jetty.version}</version>
    <scope>provided</scope>
</dependency>

в зависимостях причала и ошибки погасли. И кстати, версия jetty, которую я использую, -9.3.7.v20160115.


у меня была такая же проблема и исправлена, но я не могу понять, почему.

изменение

org.eclipse.jetty.webapp.WebAppContext

to

org.eclipse.jetty.maven.plugin.JettyWebAppContext 

он начал работать по какой-то причине, не могу понять, почему. Ясно, что плагин maven имеет к этому какое-то отношение?