2013-03-24 32 views
93

我正在運行一個Maven項目,它也是一個動態Web項目。我已經在maven中使用過所有的spring庫。我創建web.xml,但是當我開始我的Tomcat 7服務器我收到以下消息:jar沒有加載。請參閱Servlet規範2.3,第9.7.2節。違規類:javax/servlet/Servlet.class

INFO: validateJarFile(C:\Users\mibvzd0\workspace\.metadata\.plugins\ 
org.eclipse.wst.server.core\tmp2\wtpwebapps\hapi_hl7\WEB-INF\lib\ 
servlet-api-2.4.jar) - jar not loaded. 
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class 

我試圖刪除從Web應用程序/ lib中的servlet,但沒有奏效。讓我知道我的情況應該做些什麼。

+0

請注意,此行爲是根據servlet規範。充分理解有助於理解您可能遇到的更棘手的問題。 – 2015-02-09 18:37:47

+1

[Error:Servlet Jar not Loaded ... Offending class:javax/servlet/Servlet.class]可能的重複(http://stackoverflow.com/questions/1993493/error-servlet-jar-not-loaded-offending- class-javax-servlet-servlet-class) – Raedwald 2015-02-13 13:02:18

回答

105

servlet API .jar文件不能嵌入到webapp中,因爲顯然,容器已經在類路徑中包含了這些類:它實現了包含在這個jar中的接口。

的依賴應該是在provided範圍,而不是默認的compile範圍,在你的Maven POM:

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>javax.servlet-api</artifactId> 
    <version>3.1.0</version> 
    <scope>provided</scope> 
</dependency> 
+0

「依賴項應該位於Maven pom提供的範圍內,而不是默認的編譯範圍內。「我怎樣才能做到這一點 – dreambigcoder 2013-03-24 17:33:30

+0

看到我編輯的答案,清理並使用Maven構建應用程序,然後檢查servlet jar是否不在生成的webapp的WEB-INF/lib目錄中 – 2013-03-24 17:37:33

+0

我做了所有事情,但我發現在WEB-INF/lib目錄下的jar文件如果我刪除了jar文件,我得到了下面的消息INFO:Starting Servlet Engine:Apache Tomcat/7.0.12 有什麼我需要做的嗎 – dreambigcoder 2013-03-24 23:18:45

1

檢查內部的jar文件EL-api.jar中以下目錄:C:\ apache-tomcat-7.0.39 \ lib \ el-api.jar如果存在,則在您的Web應用程序的WEB-INF \ lib \ el-api.jar目錄中應該刪除該jar文件

21

您會收到此警告當servlet api jar文件已經加載到容器中並且您嘗試從lib目錄中再次加載它時發出消息。

The Servlet specs say you are not allowed to have servlet.jar in your webapps lib directory.

  • 通過簡單地從你的lib目錄中刪除servlet.jar擺脫警告消息。
  • 如果您在lib目錄中找不到該jar,請掃描您的構建路徑並刪除該jar。

C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib 

如果你正在運行一個Maven項目,在你的pom.xml由於容器本身已經提供的servlet的罐子javax.servlet-api依賴改爲範圍provided

+1

我沒有那個罐子.. – aProgrammer 2013-06-26 08:19:36

+0

@Amit檢查你的構建路徑..刪除jar文件,如果發現有.. – Lucky 2013-06-26 12:07:12

+0

得到這個異常 – aProgrammer 2013-06-26 13:17:48

0

當您的網址格式錯誤時,可能會發生此錯誤。

例如。如果您編寫了@WebServlet(「登錄」),則會顯示此錯誤。正確的是@WebServlet(「/ login」)。

2

您可能會發現以下Windows命令行可用於跟蹤有問題的jar文件。它會創建文件夾中所有罐子中所有類文件的索引。從部署的應用程序的lib文件夾中執行,然後在index.txt文件中搜索違規類。

for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt 
2

Maven Dependency Scope

provided : This is much like compile, but indicates you expect the JDK or a container to provide the dependency at runtime. For example, when building a web application for the Java Enterprise Edition, you would set the dependency on the Servlet API and related Java EE APIs to scope provided because the web container provides those classes. This scope is only available on the compilation and test classpath, and is not transitive.

4

爲了修正它,設置範圍提供。這告訴Maven使用代碼servlet-api.jar僅用於編譯和測試,但不包含在WAR文件中。部署的容器將在運行時「提供」servlet-api.jar。

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

我一直在努力解決這個問題,我嘗試了很多「解決方案」。

但是,最後,唯一一個能夠工作的實際上需要幾秒鐘的時間才能完成:刪除並添加新的服務器實例

基本上,我右鍵單擊我的Tomcat服務器在Eclipse下的服務器,並刪除它。接下來,我添加了一個新的Tomcat服務器。清理和重新部署應用程序,我擺脫了這個錯誤。

+0

右鍵單擊您的服務器 - >清理...然後再次右鍵單擊您的服務器 - >乾淨的Tomcat的工作目錄固定它對我來說 – kiltek 2017-08-30 11:11:24

-4

從源頭web-inf/lib文件夾中刪除servlet.jar,因爲它是在Tomcat中lib文件夾中,然後它工作正常

+1

這個答案不確定不添加任何不在[本答案]中的東西(http://stackoverflow.com/a/16710657/4751173)。 – Glorfindel 2015-08-13 13:02:18

0

排除和provided依賴不會在孩子的項目。

如果您在Maven項目使用繼承必須包括父pom.xml文件此配置。如果您正在使用繼承,您將在您的pom.xml 中有一個<parent>...</parent>部分。所以,你有這樣的事情在你的父母pom.xml

<groupId>some.groupId</groupId> 
<version>1.0</version> 
<artifactId>someArtifactId</artifactId> 
<packaging>pom</packaging> 
<modules> 
    <module>child-module-1</module> 
    <module>child-module-2</module> 
</modules> 
<dependencies> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet.jsp</groupId> 
     <artifactId>jsp-api</artifactId> 
     <version>2.1</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 
0

的JAX-WS依賴庫「JAXWS-rt.jar中的」缺失。

去這裏http://jax-ws.java.net/。 下載JAX-WS RI分配。 解壓縮並將「jaxws-rt.jar」複製到Tomcat庫文件夾「{$ TOMCAT}/lib」中。 重新啓動Tomcat。

0

通常,當您看到此消息時,它是良性的。 如果說

INFO: validateJarFile(/<webapp>/WEB-INF/lib/servlet-api-2.5.jar) - jar not loaded. 
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class 

意思是它忽略了你的servlet-API-2.5.jar因爲tomcat的已經有一個罐子的內置版本,所以不打算使用你的。通常這不會導致問題。

但如果它說:WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class

那麼你可以做什麼(在我的情況下,這是一個陰影罐子)運行

$ MVN依賴性:樹

,並發現你有一個傳遞依賴於依賴於servlet-api或類似的jar的「東西」(例如:tomcat-servlet-api-9.0.0)。因此排除將它添加到您的POM,例如:(在我的情況下,Tomcat,你的情況,可能是在其他的答案中提到的那些):

<dependency> 
    ... 
    <exclusions> 
     <exclusion> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>tomcat-servlet</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency>