2012-05-29 66 views
7

我有一個非常簡單的webapp項目,使用maven和jetty,直到現在一直工作得很好。但是現在我需要使用JNDI來設置MySQL連接池,因爲數據庫連接總是超時。具有DataSource的jetty-env.xml導致mvn上的WebAppContext失敗jetty: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目錄/主/ web應用/ 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的插件無法啓動的目標,我甚至無法測試,如果這方面的工作

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

編輯 之前帕維爾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 按照要求由帕維爾我用一個簡化的Web應用程序,你可以找到here on Dropbox重建錯誤。這是一個壓縮的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,好吧,我說你在classpath的某個地方有兩個碼頭類:)很高興你能解決這個問題 –

+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並確認您的碼頭依賴關係有適當的二進制碼?它必須運行而不是你期望運行的版本。

UPDATE。碼頭將執行以下操作,當它在加載配置中定義的類:通過所有getParent()

  1. Thread.currentThread().getContextClassLoader()第一負載和 循環,直到所有選項都被排出。
  2. 如果不成功,則嘗試使用加載 碼頭核心類的類加載器加載(XmlConfiguration.class.getClassLoader()) 以及循環遍歷所有父級。
  3. 如果仍不成功,請執行Class.forName()
  4. 如果不成功,則報告ClassNotFoundException

你可以看到它在org.mortbay.util.Loader代碼(http://grepcode.com是引擎蓋下快速瀏覽一個巨大的資源)

它不會加載在你的情況下,類,但顯然無法與類加載器。

我現在假設你有一個額外碼頭JAR在你的類路徑某處干擾事物的順序。

+0

這聽起來像一個很好的建議,但與此同時,我試圖在遠程生產服務器上組裝的戰爭。在那裏它會報告相同的錯誤,但不是'org.mortbay.jetty.plugin.JettyWebAppContext'類型不是 'org.eclipse.jetty.webapp.WebAppContext'。它現在報告''org.eclipse.jetty。 webapp.WebAppContext'的類型不是 'org.eclipse.jetty.webapp.WebAppContext'.',所以類加載器似乎有不同的問題。 (現在把這個信息提交給最初的問題) – ckuepker

+0

嗯,當然我檢查了二進制文件。所有版本都是正確的。我還從.m2中刪除了下載的JAR,並讓m2e再次下載它們。沒有改變。 – ckuepker

+0

@Contra,我用Jetty加載這些類的詳細信息更新了我的答案。看看你的班級是否有不止一個碼頭JAR。不幸的是,像這樣的問題很難在沒有訪問環境的情況下排除故障。你和我知道它應該工作(對其他人有用,對吧?)但它在你的特殊情況下不起作用。有些東西必須與您的特定情況不完全一致,我們只需要知道它是什麼... –

0

造成了一個同樣的問題:

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

那把多餘的碼頭罐子在classpath ...

-1

我有同樣的問題,並修復它,但不能找出原因。

通過改變

org.eclipse.jetty.webapp.WebAppContext 

org.eclipse.jetty.maven.plugin.JettyWebAppContext 

它開始出於某種原因,無法準確找出原因。很明顯,Maven插件與它有什麼關係?

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

+0

恩,在哪裏?哪個依賴關係?你能提供一些更多的背景知道你插入的位置嗎? – Cheeso

+0

@Cheeso對不起,我的答案沒有詳細解釋它。正如我在答案中已經提到的那樣,我將它包含在pom.xml下的jetty-dependencies下。我已經更新了它。 ;) – Lucky

+0

謝謝,@Lucky! – Cheeso