带有DataSource的jetty-env.xml导致mvn jetty:run上的WebAppContext失败

时间:2012-05-29 14:11:56

标签: mysql jetty jndi maven-jetty-plugin

我有一个非常简单的webapp项目,maven和jetty一直运作良好,直到现在。但现在我需要使用JNDI设置MySQL连接池,因为数据库连接总是超时。

首先,这是我的pom.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>

现在我在/ src / main / webapp / WEB-INF文件夹中创建了一个jetty-env.xml,其中包含以下内容:

<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-plugin无法启动目标

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支持,因为远程高效服务器将运行Jetty 8。

修改 在Pavel Veller的回答之前,我尝试了以下方法:将组装好的战争部署到远程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 根据Pavel的要求,我使用简化的webapp重新创建了错误,您可以找到here on Dropbox。这是一个压缩的eclipse maven项目。

5 个答案:

答案 0 :(得分:7)

尝试删除jetty-maven-plugin上的依赖项 - 此依赖项将插件添加到WAR,这是您不想要的。

如果您需要使用Jetty本身的任何类,请为范围为provided的特定Jetty版本(而不是插件)添加依赖项。

答案 1 :(得分:1)

看起来它正在从某个地方拉出码头6。您看到的异常似乎来自解析jetty-env.xmlorg.mortbay.jetty.plus.webapp.EnvConfiguration)的代码。 XMLConfiguration类将您在Configure元素上声明的类与从getWebAappContext()获取的类的实际类进行比较。在你的情况下,后者是instance of org.mortbay.jetty.plugin.JettyWebAppContext,你希望它是org.eclipse.jetty.webapp.WebAppContext(如果它们都来自同一个“命名空间”,它将是JettyWebAppContext的父类。)

很难说出会发生什么,但是可能会检查你的.m2并确认你有适合你的码头依赖的二进制文件?它必须运行不是您期望它运行的版本。

<强>更新即可。 Jetty在加载配置中定义的类时执行以下操作:

  1. 首先加载Thread.currentThread().getContextClassLoader()和 循环遍历所有getParent(),直到所有选项都用完为止。
  2. 如果不成功,尝试使用加载的类加载器加载 码头核心班(XmlConfiguration.class.getClassLoader()) 循环遍历所有父母。
  3. 如果仍然不成功,请执行Class.forName()
  4. 如果不成功,请报告ClassNotFoundException
  5. 你可以在org.mortbay.util.Loader的代码中看到它(http://grepcode.com是一个很好的资源,可以快速浏览一下)

    它会在您的情况下加载该类,但显然不是正确的类加载器。

    我现在假设你在类路径的某个地方有一个额外的码头JAR,它干扰了事物的顺序。

答案 2 :(得分:0)

由同样的问题导致:

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

在类路径中放了一个额外的码头......

答案 3 :(得分:0)

包含依赖范围为我解决了错误。

<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

答案 4 :(得分:-1)

我有同样的问题并修复了它,但无法弄清楚原因。

通过更改

org.eclipse.jetty.webapp.WebAppContext

org.eclipse.jetty.maven.plugin.JettyWebAppContext 

由于某种原因它开始起作用,无法弄清楚原因。显然,maven插件与它有关吗?