2012-05-29 10 views
7

私は非常にうまく動作しているmavenとjettyの非常に簡単なwebappプロジェクトを持っています。しかし、今はデータベース接続が常にタイムアウトするため、JNDIでMySQL接続プーリングを設定する必要があります。ここDataSourceを使用したjetty-env.xmlは、mvn jetty上でWebAppContextに失敗します。run

まず第一に、私の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に/メイン/ webappの/ WEB-INFにある桟橋-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> 

しかし、問題は、この接続が動作するかどう桟橋 - の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をサポートする必要があるとして、突堤バージョン8.xを使用するように強制していますし、リモート生産サーバとして突堤8.を実行します

EDIT パベル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 パベルによって要求されたとして、私はあなたがhere on Dropboxを見つけることができる簡略化Webアプリケーションでエラーを再作成。これはzip形式のEclipse Mavenプロジェクトです。

+0

この問題はデータソースとは関係ありません。私はjetty-env.xmlをまったく持っていません。 – Lucky

答えて

7

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

Jetty自体のクラスを使用する必要がある場合は、特定のバージョンのJetty(プラグインではなく)のスコープがprovidedの依存関係を追加します。私は同じ問題を持っていたし、それを固定ではなく、なぜ把握することはできません...

+0

それは実際に私にさらなるステップを与えました、ありがとう。これが私のMavenの理解を改善したように見えます;)しかし今、私は次のような新しいエラーがあります: 'java.lang.NoSuchMethodException:class com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource.setUsername(class java.lang .String) 'はJettyのXMLConfigurationが私のjetty-env.xmlを解析するときに' ... "によって引き起こされます。 **編集**よくタイプミスしたので、 'name =" User "'と読みます。今それは働いているようです。どうもありがとう! – ckuepker

+0

@Conta、あなたはクラスパスのどこかに2つのバージョンのjettyクラスを持っていたと言いました:)嬉しいことに、あなたはそれを解決しました –

+1

この非常に問題を抱えてかなり苦労したのち、に追加しました。ありがとう! – remrick

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の依存関係に適切なバイナリがあることを確認してください。それはあなたがそれが実行することを期待するバージョンではなく、実行している必要があります。

更新。すべてのオプションが尽くされるまで、すべてのgetParent()を通じてThread.currentThread().getContextClassLoader()

  1. 最初のロードと ループ:それは設定で定義されたクラスをロードする際の桟橋には、以下を行います。
  2. 成功しなかった場合は、 突堤コアクラス(XmlConfiguration.class.getClassLoader()) をロードしたクラスローダーをロードしてみてください。
  3. まだ成功しない場合は、Class.forName()
  4. レポートClassNotFoundException成功しない場合は、

あなたはそれがあなたのケースでクラスをロードしない

http://grepcode.comがフードの下迅速な一見のための素晴らしいリソースである)が、どうやらないorg.mortbay.util.Loaderのコードでそれを見ることができますクラスローダ。

私はあなたのクラスパスのどこかに、余分な吹き出しJARがあると仮定して、物事の順序を妨害します。

+0

それは良い提案のように聞こえるが、その間に私は組み立てられた戦争をリモート生産サーバで試した。そこに同じエラーが報告されますが、 '' org.mortbay.jetty.plugin.JettyWebAppContext 'の代わりに ' org.eclipse.jetty.webapp.WebAppContext'.'がありません。 '' org.eclipse.jettyを報告します。 webapp.WebAppContext 'のタイプが ' org.eclipse.jetty.webapp.WebAppContext 'なので、クラスローダーに別の問題があるようです。 (最初の質問にその情報を入れてください) – ckuepker

+0

まあ、私はバイナリをチェックしています。すべてのバージョンが正しいです。私はまた、ダウンロードしたJARを.m2から削除し、m2eにそれらを再度ダウンロードさせました。何も変わっていません。 – ckuepker

+0

@Contra、Jettyがこれらのクラスをどのように読み込むかについての詳細を更新しました。あなたがどこかでクラスタに複数の突堤のJARを持っているかどうか確認してください。残念ながら、このような質問は、環境にアクセスすることなくトラブルシューティングを行うのは難しいです。あなたと私はそれが働くべきであることを知っています(それは他の人のためにありますが、あなたの特別なケースではうまくいかない)。あなたの特定のケースでは何かが正確ではないはずです。私たちはそれが何であるかを知る必要があります。 –

0

はによって引き起こさ同じ問題を持っていました。それが何らかの理由で働き始め

org.eclipse.jetty.maven.plugin.JettyWebAppContext 

org.eclipse.jetty.webapp.WebAppContext 

を変更することにより

は、正確な理由を把握することはできません。明らかに、プラグインには何か関係がありますか?

-1

をクラスパスに追加の桟橋の瓶を入れ

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

0

依存関係の範囲を含めると、私のエラーが解決しました。 pom.xml

<scope>provided</scope> 

それは、このようになります桟橋の依存関係で

<!-- 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です。

+0

uh、どこですか?どんな依存関係ですか?これを挿入した場所のコンテキストをいくつか追加できますか? – Cheeso

+0

@Cheeso申し訳ありませんが、私の答えは詳しく説明していませんでした。私がすでに答えて述べたように、私はpom.xmlの下にある桟橋依存の下にそれを含めました。私はそれを更新しました。 ;) – Lucky

+0

ありがとう、@ラッキー! – Cheeso

関連する問題