2015-10-28 25 views
0

我收到了錯誤「ServletContainer不能轉換爲Servlet」,並且無法理解爲什麼,儘管在stackoverflow中閱讀了相關答案。當運行一個eclipse運行配置時,執行maven tomcat:run goal,Tomcat在哪裏加載jar?

我的發貨地點,web應用的web.xml指定:

<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 

而且它的pom.xml指定的jar文件以下依賴其中用於ServletContainer超(ES)發現:

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>servlet-api</artifactId> 
</dependency> 

當shipment-location-webapp運行配置tomcat:run目標被執行時,它讀取web.xml,嘗試加載Servlet的ServletContainer實現並報告錯誤:

"ServletContainer cannot be cast to Servlet" 

這很奇怪,因爲當我們將Tomcat作爲eclipse「服務器」運行時,不會出現這樣的錯誤。它可以在Tomcat庫或發貨位置webapp WEB-INF/lib中找到servlet-api jar文件(它可以在兩個地方找到)。

問題是由設置範圍爲這個jar解析爲POM「規定」:

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>servlet-api</artifactId> 
    <scope>provided</scope> 
</dependency> 

這是有道理的運行Tomcat作爲服務器仍然有效,因爲這個jar文件仍然發現爲「提供」在Tomcat庫中,但爲什麼這會解決運行配置tomcat的問題:運行目標?如果它在Tomcat lib中找到該文件,它應該在沒有更改範圍的情況下工作。實際上,我們可以從Tomcat庫中刪除servlet-api,它仍然可行!它不再由容器「提供」,而是由其他「提供者」提供。

事實證明,tomcat:run插件打開我的本地maven倉庫中的servlet-api-2.5.jar(「提供」或不)。如果我瀏覽我的.m2/repository/javax/servlet/servlet-api/2.5目錄並刪除jar,執行tomcat:run會恢復它,然後你不能刪除它,因爲它目前是打開的。但是即使知道tomcat:run在哪裏發現這個jar並沒有解釋爲什麼當這個依賴沒有在pom中聲明爲「provided」時,它產生了「ServletContainer不能轉換爲Servlet」的錯誤。

所以我現在實際上有兩個問題: 1)這個tomcat:運行目標看瓶子? 2)「提供」範圍是否真的導致它將jar提取到我的本地存儲庫,而不是期望它被提供?

+0

儘量保持問題儘量簡短,並儘可能地提出問題,你會得到更好,更多的答案。不是每個人都會閱讀這個數量的文本。提出問題是一門藝術,重要的是要在提供足夠的信息和提供太多的信息之間找到適當的平衡點。 – Michael

回答

0

Jersey-server依賴是必需的,將它添加到您的pom.xml並嘗試部署。

<dependency> 
    <groupId>org.glassfish.jersey.core</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>2.11</version> 
    </dependency> 
相關問題