ไม่ได้โหลดโถ โปรดดู Servlet Spec 2.3 ส่วน 9.7.2 คลาสที่กระทำผิด: javax / servlet / Servlet.class


100

ฉันกำลังดำเนินโครงการ Maven ซึ่งเป็นโครงการเว็บแบบไดนามิกด้วย ฉันใช้ห้องสมุด Spring ทั้งหมดใน Maven แล้ว ฉันสร้างขึ้น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

ฉันพยายามลบ servlet จากwebapp/libแต่มันไม่ได้ผล แจ้งให้เราทราบว่าควรดำเนินการอย่างไรในกรณีของฉัน


สังเกตว่าลักษณะการทำงานนี้เป็นไปตามข้อกำหนดของ servlet ความเข้าใจอย่างถ่องแท้มีประโยชน์ในการทำความเข้าใจปัญหาที่ยุ่งยากกว่าที่คุณอาจพบ
Thorbjørn Ravn Andersen

1
อาจเกิดข้อผิดพลาด
Raedwald

คำตอบ:


113

ต้องไม่ฝังไฟล์ 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>

"การพึ่งพาควรอยู่ในขอบเขตที่ให้ไว้แทนที่จะเป็นขอบเขตการคอมไพล์เริ่มต้นใน Maven pom ของคุณ" ฉันจะทำอย่างนั้นได้อย่างไร
dreambigcoder

ดูคำตอบที่แก้ไขของฉัน ทำความสะอาดและสร้างแอปโดยใช้ Maven และตรวจสอบว่า servlet jar ไม่ได้อยู่ในไดเรกทอรี WEB-INF / lib ในเว็บแอปที่สร้างขึ้น
JB Nizet

ฉันทำทุกอย่างแล้ว แต่ฉันพบ jar ในไดเรกทอรี WEB-INF / lib ถ้าฉันเอาขวดออกฉันจะได้รับข้อความด้านล่าง INFO: การเริ่มต้น Servlet Engine: Apache Tomcat / 7.0.12 มีอะไรที่ฉันต้องทำหรือไม่?
dreambigcoder

6
บางทีคุณอาจมีการพึ่งพาที่มีการพึ่งพาสกรรมกริยาไปยังรุ่นของ servlet jar อื่น ใช้ mvn dependency: tree เพื่อค้นหาว่า servlet jar นี้มาจากไหนและเพิ่มการยกเว้น
JB Nizet

ฉันจะทำเช่นเดียวกันกับไอวี่ได้อย่างไร?
Dinesh Babu KG

21

คุณได้รับข้อความเตือนนี้เมื่อโหลดไฟล์ servlet api jar ในคอนเทนเนอร์แล้วและคุณพยายามโหลดอีกครั้งจากlibไดเร็กทอรี

ข้อกำหนดของ Servlet บอกว่าคุณไม่ได้รับอนุญาตให้มีservlet.jarในlibไดเรกทอรีwebapps ของคุณ

  • กำจัดข้อความเตือนเพียงแค่ลบออกservlet.jarจากlibไดเรกทอรีของคุณ
  • หากคุณไม่พบ jar ในlibไดเร็กทอรีให้สแกนหาเส้นทางการสร้างของคุณและนำ jar ออก

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

หากคุณกำลังรันโปรเจ็กต์ maven ให้เปลี่ยนการjavax.servlet-apiอ้างอิงเป็นขอบเขตprovidedในคุณ pom.xml เนื่องจากคอนเทนเนอร์ได้จัดเตรียม servlet jar ไว้ในตัวแล้ว


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>

2

คุณอาจพบว่าบรรทัดคำสั่ง windows ต่อไปนี้มีประโยชน์ในการติดตามไฟล์ jar ที่กระทำผิด มันสร้างดัชนีของไฟล์คลาสทั้งหมดในขวดทั้งหมดในโฟลเดอร์ ดำเนินการจากภายในโฟลเดอร์ lib ของแอพที่คุณปรับใช้แล้วค้นหาไฟล์ index.txt สำหรับคลาสที่กระทำผิด

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

2

ขอบเขตการพึ่งพา Maven

มีให้ : นี้เป็นเหมือนการรวบรวม แต่แสดงว่าคุณคาดหวัง JDKหรือภาชนะที่จะให้การพึ่งพาที่รันไทม์ ตัวอย่างเช่นเมื่อมีการสร้างโปรแกรมประยุกต์บนเว็บสำหรับ Java Enterprise Edition คุณจะตั้งค่าการพึ่งพาที่Servlet APIและเกี่ยวข้องกับ Java EE API เพื่อขอบเขตที่จัดไว้ให้เพราะภาชนะเว็บให้เรียนเหล่านั้น ขอบเขตนี้พร้อมใช้งานบนคลาสพา ธ การคอมไพล์และการทดสอบเท่านั้นและไม่มีสกรรมกริยา


1

ฉันพยายามดิ้นรนกับปัญหานี้และได้ลอง "วิธีแก้ปัญหา" มากมาย

อย่างไรก็ตามในที่สุดสิ่งเดียวที่ใช้งานได้และใช้เวลาเพียงไม่กี่วินาทีในการทำคือ: ลบและเพิ่มอินสแตนซ์เซิร์ฟเวอร์ใหม่ !

โดยทั่วไปฉันคลิกขวาที่เซิร์ฟเวอร์ Tomcat ของฉันใน Eclipse ภายใต้เซิร์ฟเวอร์และลบออก ต่อไปฉันได้เพิ่มเซิร์ฟเวอร์ Tomcat ใหม่ ทำความสะอาดและปรับใช้แอปพลิเคชันใหม่แล้วฉันก็กำจัดข้อผิดพลาดนี้


คลิกขวาที่เซิร์ฟเวอร์ของคุณ -> ทำความสะอาด ... จากนั้นคลิกขวาที่เซิร์ฟเวอร์ของคุณอีกครั้ง -> ล้างไดเร็กทอรีงาน tomcat ที่แก้ไขให้ฉัน
kiltek

0

ตรวจสอบภายในไดเรกทอรีต่อไปนี้สำหรับไฟล์ jar el-api.jar: C: \ apache-tomcat-7.0.39 \ lib \ el-api.jar หากมีอยู่ในไดเรกทอรีนี้ของเว็บแอปพลิเคชันของคุณ WEB-INF \ lib \ el-api.jar ควรถอดโถออก


0

เมื่อรูปแบบ URL ของคุณไม่ถูกต้องข้อผิดพลาดนี้อาจเกิดขึ้น

เช่น. หากคุณเขียน @WebServlet ("เข้าสู่ระบบ") ข้อผิดพลาดนี้จะแสดงขึ้น ที่ถูกต้องคือ @WebServlet ("/ login")


0

การยกเว้นและการprovidedอ้างอิงจะไม่ทำงานในโครงการย่อย

หากคุณใช้การสืบทอดในโปรเจ็กต์ Maven คุณต้องรวมคอนฟิกูเรชันนี้ไว้ในpom.xmlไฟล์พาเรนต์ คุณจะมี<parent>...</parent>ส่วนใน pom.xml ของคุณถ้าคุณกำลังใช้มรดก ดังนั้นคุณจะมีสิ่งนี้ในพ่อแม่ของคุณ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 distribution แตกไฟล์และคัดลอก“ 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 มี jar ในตัวอยู่แล้วจึงไม่ใช้ของคุณ โดยทั่วไปจะไม่ก่อให้เกิดปัญหา

อย่างไรก็ตามหากกล่าวว่า WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class

จากนั้นสิ่งที่คุณสามารถทำได้ (ในกรณีของฉันมันคือโถสีเทา) จะถูกเรียกใช้

การพึ่งพา $ mvn: ต้นไม้

และค้นพบว่าคุณมีการพึ่งพาสกรรมกริยาที่ "บางอย่าง" ที่ขึ้นอยู่กับขวดที่เป็นทั้ง servlet-API หรือสิ่งที่ต้องการมัน (เช่น: tomcat-servlet-api-9.0.0) ดังนั้นเพิ่มการยกเว้นให้กับ pom ของคุณเช่น: (ในกรณีของฉันแมวตัวผู้ในกรณีของคุณอาจเป็นสิ่งที่กล่าวถึงในคำตอบอื่น ๆ ):

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

-4

ลบออกservlet.jarจากweb-inf/libโฟลเดอร์ซอร์สเนื่องจากมีอยู่ในlibโฟลเดอร์tomcat ก็ใช้งานได้ดี


1
คำตอบนี้ไม่ได้เพิ่มสิ่งที่ไม่มีอยู่ในคำตอบนี้
Glorfindel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.