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.

では、どうすればこれを機能させることができますか?WebSocket のサポートが必要であり、リモートの本稼働サーバーが Jetty 8 を実行するため、Jetty バージョン 8.x を使用せざるを得ません。

編集 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 のリクエストに応じて、ここで Dropbox で 見つけることができる単純化された webapp でエラーを再現しました。これは、圧縮された eclipse maven プロジェクトです。

4

5 に答える 5

7

への依存関係を削除してみてください。jetty-maven-pluginこの依存関係により、望ましくないプラグインが WAR に追加されます。

Jetty 自体のクラスを使用する必要がある場合は、特定のバージョンの Jetty (プラグインではなく) の依存関係をprovided.

于 2012-05-30T07:57:40.820 に答える
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()すべての親をループするjettyコアクラス()をロードしたクラスローダーを使用してロードしてみてください。
  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 に答える