[英]ervlet-api.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: 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
提供:這很像編譯,但表明您希望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.