java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet


87

ฉันใช้spring 3.1.0.RELEASEและคอนเทนเนอร์ servlet ของฉันคือtomcat 7และ IDE ของฉันคือeclipse indigo และ jar spring-webmvc-3.1.0.RELEASE.jarซึ่งมีDispatcherServlet อยู่ในโฟลเดอร์ lib และเมื่อ เรียกใช้แอปพลิเคชันฉันได้รับข้อยกเว้น:

java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1678)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:525)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:507)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:126)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1099)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1043)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4957)
    at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5284)
    at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5279)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

โปรดแจ้งว่าเหตุใดฉันจึงได้รับข้อยกเว้นนี้และวิธีแก้ไข

แก้ไข: ต่อไปนี้เป็นไฟล์การกำหนดค่าของฉัน:

1-. ต้นถั่ว:

<?xml version="1.0" encoding="UTF-8"?>
<beansProjectDescription>
    <version>1</version>
    <pluginVersion><![CDATA[2.9.0.201203011806-RELEASE]]></pluginVersion>
    <configSuffixes>
        <configSuffix><![CDATA[xml]]></configSuffix>
    </configSuffixes>
    <enableImports><![CDATA[false]]></enableImports>
    <configs>
        <config>src/main/webapp/WEB-INF/checkout-servlet.xml</config>
    </configs>
    <configSets>
    </configSets>
</beansProjectDescription>

2- web.xml:

<web-app>
  <display-name>Checkout</display-name>

  <servlet>
    <servlet-name>checkout</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>checkout</servlet-name>
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>

</web-app>

3- ชำระเงิน servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <context:component-scan base-package="com.myapp"/>

    <bean id="myService" class="com.myapp.MyService"/>

</beans>

นอกจากนี้เมื่อพยายามเข้าถึงหน้าใด ๆ ในแอปพลิเคชันฉันได้รับข้อยกเว้น:

HTTP Status 404 - Servlet checkout is not available

type Status report

message Servlet checkout is not available

description The requested resource (Servlet checkout is not available) is not available.
Apache Tomcat/7.0.22

คุณสามารถโพสต์ไฟล์ปรับแต่งสปริงของคุณและบอกเราว่ามันควรจะทำงานบนเซิร์ฟเวอร์แอปใด
Gergely Szilagyi

@Gergely Szilagyi ฉันอัปเดตคำถาม
Mahmoud Saleh

ลบคำตอบของฉันเพราะไม่มีประโยชน์ ขออภัย :(
Gergely Szilagyi

@iNan ฉันใช้ eclipse indigo
Mahmoud Saleh

1
ฉันเชื่อว่าไม่ใช่ CNF โดยตรงบน DispatcherServlet แต่คลาสที่อ้างอิงได้ทำให้เกิดข้อผิดพลาด ตรวจสอบว่าคุณเห็นข้อยกเว้นอื่น ๆ ที่ซ้อนอยู่หรือไม่
adarshr

คำตอบ:


250

คุณต้องเพิ่ม "Maven Dependency" ใน Deployment Assembly

  • คลิกขวาที่โครงการของคุณและเลือกคุณสมบัติ
  • คลิกที่ Deployment Assembly
  • คลิกเพิ่ม
  • คลิกที่ "Java Build Path Entries"
  • เลือก Maven Dependencies "
  • คลิกเสร็จสิ้น

สร้างใหม่และปรับใช้อีกครั้ง

หมายเหตุ: สิ่งนี้ใช้ได้กับโครงการที่ไม่ใช่ maven


ดี - ฉันรู้สึกสับสนที่เห็นแม้หลังจากเพิ่มการอ้างอิงที่เหมาะสมใน pom.xml ของฉันก็ไม่ได้แก้ไขข้อผิดพลาดจนกว่าฉันจะทำตามข้างบน ..
srinivas

ดี.. ลงตัว
ปราสาด VS

1
ทำไมถึงได้ผล? ฉันหมายความว่าไม่ควรมีการพึ่งพา maven ทั้งหมดหรือไม่? ถ้าฉันใช้ Tomcat7 เสียบกับ tomcat7: run สิ่งนี้จะสำเร็จได้อย่างไร?
Johnny Bigoode

ใช้งานได้อย่างมีเสน่ห์!
yrazlik

นอกจากนี้ยังสามารถใช้ได้กับโครงการที่ไม่ใช่ maven !! ฉันสร้างโครงการ maven และพบปัญหาเดียวกัน วิธีนี้ใช้ได้ผลสำหรับฉัน
Bandham Manikanta

33

คำตอบที่เป็นไปได้สองข้อ:

1- คุณไม่ได้ใส่ถั่วสปริงและขวดใส่สปริงไว้ใน lib ของคุณ หากคุณใช้ maven (ซึ่งจะช่วยได้มาก) ทั้งสองบรรทัดก็เพียงพอแล้ว

<dependency>
 <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
   <version>3.1.0.RELEASE</version>
</dependency>
<dependency>
 <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
   <version>3.1.0.RELEASE</version>
</dependency>

2- ขวดโหลที่จำเป็นอยู่ใน classpath ของคุณ แต่ไม่ได้ติดตั้งบน tomcat


ยินดีที่คุณแก้ปัญหาได้ แต่ฉันไม่คิดว่าจะเข้าใจได้จากปัญหาของคุณว่าคุณใช้ maven
Serkan Arıkuşu

1
maven ถูกแท็กคำถาม!
Mahmoud Saleh

3
เพิ่มความspring-webmvcตั้งใจของฉันเพื่อpom.xmlแก้ปัญหา ขอบคุณ.
OO7

19

ฉันมีปัญหาเดียวกันกับ Idea Intellij และ Spring 4 ฉันแก้ไขปัญหาแล้วและฉันต้องการแบ่งปันคำตอบกับคุณ

ฉันใช้ tomcat 7 / idea intellij 13 / spring 4

pom.xml การอ้างอิง:

  <properties>
    <spring.version>4.0.5.RELEASE</spring.version>
  </properties>

  <dependencies>     
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
enter code here
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.2</version>
    </dependency>
        <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.4</version>
    </dependency>
  </dependencies>

ในแนวคิด Intellij คุณต้องไปที่ File -> Project Settings -> Artifacts

แล้ว ใส่คำอธิบายภาพที่นี่

ทำความสะอาด -> สร้างโครงการใหม่ -> สร้างสิ่งประดิษฐ์และทุกอย่างจะเรียบร้อย


คุณเป็นอัจฉริยะ คุณช่วยอธิบายได้ไหมว่ามันสร้างความแตกต่างอะไร ทำไม Maven จึงนำเข้าทุกอย่าง แต่คุณยังต้องทำเช่นนั้นจึงจะใช้งานได้?
DMurta

@ มูร์ต้าที่บอกว่ามาเวนส่งออกทุกอย่าง?
Adelin

13

วิธีนี้ช่วยแก้ปัญหาให้ฉันได้ มันง่ายและอธิบายได้สวย

ขั้นตอนที่ 1

  • คลิกขวาที่โครงการ
  • คลิกที่ Properties

ขั้นตอนที่ 2

  • คลิกที่แท็บ Deployment Assembly ในไฟล์
  • คลิกเพิ่ม ...

ขั้นตอนที่ 3

  • คลิกที่ Java Build Path Entries

ขั้นตอนที่ 4

  • คลิกที่ Maven Dependencies
  • คลิกปุ่ม Finish

ขั้นตอนที่ 5

  • ปรับใช้แอปพลิเคชัน Spring MVC เป็น Tomcat อีกครั้ง
  • รีสตาร์ท Tomcat
  • รายการ

classnotfoundexception


คุณจะพิจารณาเกรดที่คุณให้กับโจทย์ของฉันใหม่ไหม
Lycone

10

ฉันพบว่าในแอสเซมบลีการปรับใช้มีรายการ:

[persisted container] org.maven.ide.eclipse.maven2_classpath_container

ฉันลบมันและเพิ่มmaven dependenciesรายการและตอนนี้ก็ใช้งานได้ดี


5

หากคำแนะนำเหล่านี้ไม่ได้ผลคุณควรสร้างเซิร์ฟเวอร์ของคุณใหม่ (Tomcat หรือแบบนั้น) นั่นช่วยแก้ปัญหาของฉันได้


5

รวมการพึ่งพาด้านล่างใน pom.xml ของคุณ

<dependency>
 <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
   <version>{spring-version}</version>
</dependency>

4

ฉันประสบปัญหาเดียวกัน เมื่อฉันเห็นในโฟลเดอร์ maven repository .m2 (.... m2 \ repository \ org \ springframework \ spring-webmvc) ในโลคัลของฉันฉันพบโฟลเดอร์ 3.2.0.RELEASE สองโฟลเดอร์ ดังนั้นฉันจึงลบออก จากนั้นฉันไปที่โปรเจ็กต์คลิกขวา -> คุณสมบัติ -> องค์ประกอบการปรับใช้ -> เพิ่มการอ้างอิง maven ล้างบิลด์แล้วรีสตาร์ทเซิร์ฟเวอร์ จากนั้น DispatcherServlet ถูกโหลด


ใช่สิ่งนี้ช่วยแก้ปัญหาของฉันได้เช่นกันความคิดใด ๆ ที่จำเป็นต้องเพิ่มการอ้างอิงในการปรับใช้แอสเซมบลีใน eclipse
Freelancer

2

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


2

คุณสามารถใช้เซิร์ฟเวอร์ GlassFish และข้อผิดพลาดจะได้รับการแก้ไข ฉันลองใช้ tomcat7 และ tomcat8 แต่ข้อผิดพลาดนี้เกิดขึ้นอย่างต่อเนื่อง แต่แก้ไขได้ด้วย GlassFish ฉันคิดว่ามันเป็นปัญหากับเซิร์ฟเวอร์

นี่คือผลลัพธ์ของ tomcat7: ผลลัพธ์ด้วย tomcat7

นี่คือผลลัพธ์ของ GlassFish: ผลลัพธ์กับ GlassFish


2
  1. ไปที่คุณสมบัติของโครงการที่คุณทำงาน
  2. เลือกเมนูDeployment Assemblyและคลิกที่ปุ่ม add
  3. เลือกรายการJava Build Pathและคลิกที่Maven Dependencies
  4. สร้างโครงการและเรียกใช้

ใส่คำอธิบายภาพที่นี่


1
ฉันไม่มีตัวเลือก Maven Dependencies เมื่อฉันคลิกที่ Java Build Path Entries
มุกตาดีร์ข่าน

ฉันไม่รู้ว่าคุณถามคำถามนี้ในแง่มุมไหน โปรดลองโพสต์คำถามใหม่
Lova Chittumuri

1

คลิกขวาที่โครงการของคุณและเลือกคุณสมบัติ คลิกที่ Deployement Assembly คลิกเพิ่มคลิกที่ "Java Build Path Entries" เลือก Maven Dependencies "คลิกเสร็จสิ้น


1

อาจเป็นประโยชน์สำหรับใครบางคนฉันจะโพสต์ไว้ที่นี่ ฉันขาดการพึ่งพานี้กับไฟล์pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

0

ฉันแก้ไขโดยทำตามขั้นตอนเหล่านี้:

  • คลิกขวาในโครงการ> กำหนดค่า> แปลงเป็นโครงการ Maven
  • หลังจากการแปลงคลิกขวาในโครงการ> Maven> อัปเดตโครงการ

ซึ่งจะแก้ไขการตั้งค่า "Deployment Assembly" ของโครงการ


0

ย้ายไฟล์ jar จาก classpath ของคุณไปยังweb-inf / libและเรียกใช้เซิร์ฟเวอร์ tomcat ใหม่



0

ฉันมีปัญหาเดียวกันนี้ใน WebSphere แต่ไม่สามารถหาวิธีแก้ไขได้แม้ว่าฉันจะตรวจสอบการอ้างอิง Spring อยู่ที่นั่นและมันก็ทำงานใน Tomcat ได้ดี ฉันลงเอยด้วยการถอนการติดตั้งแอปพลิเคชันและยังคงได้รับข้อผิดพลาดดังนั้นฉันจึงคิดว่า WebSphere ค้างอยู่ในอินสแตนซ์ที่เสียหาย

เพื่อแก้ไขปัญหาที่ฉันต้องติดตั้งแอปพลิเคชันใหม่หยุดแอปพลิเคชันถอนการติดตั้งแล้วติดตั้งใหม่


0

สำหรับฉันมันเป็นข้อผิดพลาดในpom.xml- ฉันตั้งค่าการ<scope>provided<scope>อ้างอิงของฉันและสิ่งนี้ทำให้พวกเขาไม่ถูกคัดลอกในช่วงmvn packageเวที

อาการของฉันคือข้อความแสดงข้อผิดพลาดที่ OP โพสต์และไหไม่รวมอยู่ในพา ธ WEB-INF / lib ภายใน. war after package ถูกเรียกใช้ เมื่อฉันลบขอบเขตออกไปไหก็ปรากฏขึ้นในเอาต์พุตและตอนนี้โหลดทั้งหมดได้ดี

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