7

我有一个非常简单的带有 maven 和 jetty 的 webapp 项目,到目前为止一直运行良好。但是现在我需要使用 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 的要求,我使用简化的 web 应用程序重新创建了错误,您可以在 Dropbox 上找到。这是一个压缩的 Eclipse Maven 项目。

4

5 回答 5

7

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

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

于 2012-05-30T07:57:40.820 回答
1

看起来它正在从某个地方拉动 6 号码头。您看到的异常似乎来自解析jetty-env.xml( org.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不成功就 报告。

你可以在代码中看到它org.mortbay.util.Loaderhttp://grepcode.com是一个很好的资源,可以快速查看引擎盖)

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

我现在假设您的类路径中某处有一个额外的码头 JAR,它会干扰事物的顺序。

于 2012-05-29T19:06:44.653 回答
0

有同样的问题引起:

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

这在类路径中放置了一个额外的码头罐子......

于 2013-09-30T10:08:11.477 回答
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>

在码头依赖项中,错误消失了。顺便说一句,我使用的码头版本是9.3.7.v20160115.

于 2015-06-29T11:05:20.030 回答
-1

我遇到了同样的问题并修复了它,但不知道为什么。

通过改变

org.eclipse.jetty.webapp.WebAppContext

org.eclipse.jetty.maven.plugin.JettyWebAppContext 

它出于某种原因开始工作,无法弄清楚究竟是为什么。显然maven插件与它有关?

于 2014-08-03T16:58:17.373 回答