簡體   English   中英

jar 未加載。 請參閱 Servlet 規范 2.3,第 9.7.2 節。 違規類:javax/servlet/Servlet.class

[英]jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

我正在運行一個 Maven 項目,它也是一個動態 Web 項目。 我在 Maven 中使用了所有 Spring 庫。 我創建了web.xml ,但是當我啟動我的 Tomcat 7 服務器時,我收到以下消息:

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

我嘗試從webapp/lib刪除 servlet,但沒有奏效。 讓我知道在我的情況下應該怎么做。

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

依賴項應該在您的 Maven pom 中provided范圍內,而不是默認的compile范圍內:

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

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

Servlet 規范說你的 webapps lib目錄中不允許有servlet.jar

  • 只需從lib目錄中刪除servlet.jar ,即可消除警告消息。
  • 如果在lib目錄中找不到 jar,請掃描構建路徑並刪除 jar。

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

如果您正在運行 maven 項目,請將javax.servlet-api依賴項更改為 pom.xml 中provided范圍,因為容器本身已經提供了 servlet jar。

要修復它,請將范圍設置為provided 這告訴 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>

您可能會發現以下 Windows 命令行有助於追蹤有問題的 jar 文件。 它為文件夾中所有 jars 中的所有類文件創建一個索引。 從已部署應用程序的 lib 文件夾中執行,然后在 index.txt 文件中搜索有問題的類。

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

Maven 依賴范圍

提供:這很像編譯,但表明您希望JDK容器在運行時提供依賴項。 例如,在為 Java Enterprise Edition 構建 Web 應用程序時,您可以將對Servlet API和相關 Java EE API 的依賴項設置為提供范圍因為Web 容器提供這些類 此范圍僅在編譯和測試類路徑上可用,並且不可傳遞。

我一直在努力解決這個問題,並且嘗試了許多“解決方案”。

但是,最后,唯一有效且實際上花了幾秒鍾的時間是:刪除並添加回新的服務器實例

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

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

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

例如。 如果你寫了@WebServlet("login"),就會顯示這個錯誤。 正確的是@WebServlet("/login")。

排除項和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>

缺少 JAX-WS 依賴庫“jaxws-rt.jar”。

去這里http://jax-ws.java.net/ 下載 JAX-WS RI 發行版。 解壓並將“jaxws-rt.jar”復制到Tomcat庫文件夾“{$TOMCAT}/lib”。 重啟Tomcat。

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

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 已經具有該 jar 的內置版本,因此它不會使用您的。 通常這不會導致問題。

但是,如果它說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>

來自https://stackoverflow.com/a/9941668/778517

我做了mvn dependency:tree結果是

(...)
[INFO] +- org.zkoss.zk:zkspring-core:jar:3.2.0:compile
[INFO] |  +- org.springframework:spring-beans:jar:3.0.7.RELEASE:compile
[INFO] |  +- org.springframework:spring-context:jar:3.0.7.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-asm:jar:3.0.7.RELEASE:compile
[INFO] |  +- org.springframework:spring-web:jar:3.0.7.RELEASE:compile
[INFO] |  \- org.reflections:reflections:jar:0.9.5-RC2:compile
[INFO] |     +- com.google.collections:google-collections:jar:1.0:compile
[INFO] |     +- ch.qos.logback:logback-classic:jar:0.9.9:runtime
[INFO] |     |  \- ch.qos.logback:logback-core:jar:0.9.9:runtime
[INFO] |     +- com.google.code.gson:gson:jar:1.4:compile
[INFO] |     \- javax.servlet:servlet-api:jar:2.5:compile
(...)

所以在 pom.xml, zkspring-core 我添加了排除標簽

(...)
             <groupId>org.zkoss.zk</groupId>
             <artifactId>zkspring-core</artifactId>
             <version>3.2.0</version>
+            <exclusions>
+                <exclusion>
+                <groupId>javax.servlet</groupId>
+                <artifactId>servlet-api</artifactId>
+                </exclusion>
+            </exclusions>
             </dependency>
(...)

在我運行mvn dependency:tree和 javax.servlet:servlet-api:jar:2.5:compile 之后是干凈的

(...)
[INFO] +- org.zkoss.zk:zkspring-core:jar:3.2.0:compile
[INFO] |  +- org.springframework:spring-beans:jar:3.0.7.RELEASE:compile
[INFO] |  +- org.springframework:spring-context:jar:3.0.7.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-asm:jar:3.0.7.RELEASE:compile
[INFO] |  +- org.springframework:spring-web:jar:3.0.7.RELEASE:compile
[INFO] |  \- org.reflections:reflections:jar:0.9.5-RC2:compile
[INFO] |     +- com.google.collections:google-collections:jar:1.0:compile
[INFO] |     +- ch.qos.logback:logback-classic:jar:0.9.9:runtime
[INFO] |     |  \- ch.qos.logback:logback-core:jar:0.9.9:runtime
[INFO] |     \- com.google.code.gson:gson:jar:1.4:compile
(...)

從源web-inf/lib文件夾中刪除servlet.jar ,因為它在 tomcat lib文件夾中可用,然后它工作正常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM