簡體   English   中英

java.lang.ClassCastException:class org.springframework.web.servlet.DispatcherServlet 無法轉換為 class jakarta.servlet.Servlet

[英]java.lang.ClassCastException: class org.springframework.web.servlet.DispatcherServlet cannot be cast to class jakarta.servlet.Servlet

我已經看到了與我類似的問題的答案,但我已經嘗試了所有方法,錯誤並沒有消失 go 。 我了解到 api servlet 類由兩個不同的 class 加載器加載,因為 web 部署程序集中有多個源。 我嘗試使用 servlet-api-3.0-alpha-1.jar 刪除它,但如果我從 WEB-INF\lib 文件夾中刪除相同的 package,它會給我更多錯誤。 還要補充一點,它是導入eclipse的spring項目,我創建了一個web動態項目,然后轉換成maven項目。 由於通過調試,我發現嵌入式服務器沒有為我運行更新的jsp頁面,我將項目更改為mvc以便在eclipse中擁有正常的服務器。服務器是tomcat 10,我不知道是哪些包它從 maven 加載,哪些從 lib 文件夾加載。

如果我從 lib servlet-api-3.0-alpha-1.jar 中刪除,我會看到錯誤:無法解析類型 javax.servlet.ServletContext。 間接引用自required.class文件MyInitializer.java

如果我從 lib jakarta.el-5.0-M1.jar 中刪除,我會看到錯誤:The project cannot be build until build path errors are resolved

“Parlamento”項目缺少所需的庫:“C:\Users\segreteria\Desktop\WORKSPACE 4\Parlamento\src\main\webapp\WEB-INF\lib\jakarta.el-5.0.0-M1.jar”

如果我將 tomcat 從 10 降級到 9,我還必須更改 spring 版本,因為 tomcat 9 不支持版本 5,然后我必須更改所有 jar 包。

如果我使用 tomcat 9.0.62 那么我必須使用 spring 4 所以我必須使用 applicationContext.xml 拋出其他錯誤,這些錯誤在 tomcat 的更高版本中修復,這讓我再次更新 spring 包。

堆棧跟蹤:

SEVERE: Allocate exception for servlet [Parlamento]
java.lang.ClassCastException: class org.springframework.web.servlet.DispatcherServlet 
cannot be cast to class jakarta.servlet.Servlet 
(org.springframework.web.servlet.DispatcherServlet is in unnamed module of loader 
org.apache.catalina.loader.ParallelWebappClassLoader @1601e47; 
jakarta.servlet.Servlet is in unnamed module of loader java.net.URLClassLoader 
 @6bdf28bb)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1071)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:789)
at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:128)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(
AuthenticatorBase.java:542)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at 
org.apache.catalina.valves.AbstractAccessLogValve.invoke
(AbstractAccessLogValve.java:690)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:356)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process
(AbstractProtocol.java:867)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun
(NioEndpoint.java:1762)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker
(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run
(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:833)

網絡部署程序集

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.5</version>
   <relativePath></relativePath>
</parent>
<groupId>com.giuggiola</groupId>
<artifactId>Parlamento</artifactId>

  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
<name>Parlamento</name>
<description>Demo project for Spring Boot</description>
<properties>
    <java.version>18</java.version>
</properties>

<dependencies>


<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>

<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-annotations-api</artifactId>
<!--   <version>10.0.23</version>-->
</dependency>


<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
 <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<!--  <version>2.0.0</version> -->
<scope>provided</scope>
</dependency>

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
      <!--    <version>1.2</version> -->
         <scope>provided</scope>
    </dependency>
   

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.1.5.Final</version>
<type>pom</type>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<!--   <version>6.0.0</version> -->
<scope>provided</scope>
</dependency>

 <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
 
    <scope>provided</scope>
</dependency>
 
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
 <!--     <version>4.13.2</version>-->
<scope>provided</scope>

</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
 <!-- <version>5.3.23</version> -->
   <scope>provided</scope>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<scope>provided</scope>
</dependency>

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId> 
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>jakarta.servlet.jsp</groupId>
    <artifactId>jakarta.servlet.jsp-api</artifactId>
    <version>3.0.0</version>
    <scope>provided</scope>
</dependency>
 
<dependency>
    <groupId>jakarta.el</groupId>
    <artifactId>jakarta.el-api</artifactId>
    <version>4.0.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>jakarta.websocket</groupId>
    <artifactId>jakarta.websocket-api</artifactId>
 <!--  <version>2.0.0</version>  -->  
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>jakarta.security.enterprise</groupId>
    <artifactId>jakarta.security.enterprise-api</artifactId>
    <version>2.0.0</version>
    <scope>provided</scope>
</dependency>


<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<!--    <version>42.5.0</version> --> 
</dependency>

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
 <!--  <version>2.7.3</version>-->
<scope>provided</scope>

</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<!--  <version>2.7.4</version>-->
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<!-- <version>2.7.4</version>-->
<scope>provided</scope>
</dependency>

<dependency>
        <groupId>com.vladmihalcea</groupId>
        <artifactId>hibernate-types-55</artifactId>
        <version>2.14.0</version>
    </dependency>

 </dependencies>

 <build>
 <finalName>Parlamento</finalName>


    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        
        
        <!-- plugin che ho aggiunto io-->
        <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<!--  <version>3.2.0</version> -->
<!--  <scope>provided</scope> -->
</plugin>    
    </plugins>

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>

</build>
</project>

庫

堆棧跟蹤:

dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version name:   Apache Tomcat/9.0.69
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          Nov 9 2022 18:43:47 UTC
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version number: 9.0.69.0
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name:               Windows 8
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version:            6.2
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          amd64
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home:             C:\Program Files\Java\jdk- 
17.0.5_windows-x64_bin\jdk-17.0.5
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version:           17.0.5+9-LTS-191
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor:            Oracle Corporation
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE:         
C:\Users\segreteria\Desktop\WORKSPACE 
4\.metadata\.plugins\org.eclipse.wst.server.core\tmp1
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME:         C:\Program Files\Apache Software 
Foundation\Tomcat 9.0_Tomcat9.0.69
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: - 
XX:+ShowCodeDetailsInExceptionMessages
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: - 
agentlib:jdwp=transport=dt_socket,suspend=y,address=
localhost:65348
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: - 
javaagent:C:\Users\segreteria\eclipse\jee-2022- 
06\eclipse\configuration\org.eclipse.osgi\407\0\.cp\lib\
javaagent-shaded.jar
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: - 
Dcatalina.base=C:\Users\segreteria\Desktop\WORKSPACE 
4\.metadata\.plugins\org.eclipse.wst.server.core\tmp1
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=C:\Program 
Files\Apache Software Foundation\Tomcat 9.0_Tomcat9.0.69
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -  
.deploy=C:\Users\segreteria\Desktop\WORKSPACE 
4\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: --add-opens=java.base/java.lang=ALL- 
UNNAMED
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: --add-opens=java.base/java.io=ALL- 
UNNAMED
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: --add-opens=java.base/java.util=ALL- 
UNNAMED
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: --add- 
opens=java.base/java.util.concurrent=ALL-UNNAMED
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: --add- 
opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
dic 06, 2022 6:13:12 PM 
org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dfile.encoding=UTF-8
dic 06, 2022 6:13:13 PM 
org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The Apache Tomcat Native library which allows using OpenSSL 
was not found on the java.library.path: [C:\Program 
Files\Java\jdk-17.0.5_windows-x64_bin\jdk- 
17.0.5\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:
Windows;C:\Program Files\Common 
Files\Oracle\Java\javapath;C:\Program Files (x86)\Common 
Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;
C:\Windows\System32\Wbem;C:\Windows\System32\
WindowsPowerShell\v1.0\;C:\Maven\apache-maven-3.8.6- 
bin\bin;C:\Program Files\Java\jdk-17.0.5_windows-x64_bin\jdk- 
17.0.5\bin;;C:\Users\segreteria\AppData\Local\Programs\Microsoft 
VS Code\bin;C:\Program Files\Java\jdk-17.0.5_windows-x64_bin\jdk- 
17.0.5\bin;.]
dic 06, 2022 6:13:14 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8088"]
dic 06, 2022 6:13:15 PM org.apache.catalina.startup.Catalina load
INFO: Server initialization in [5346] milliseconds
dic 06, 2022 6:13:15 PM org.apache.catalina.core.StandardService 
startInternal
INFO: Starting service [Catalina]
dic 06, 2022 6:13:15 PM org.apache.catalina.core.StandardEngine 
startInternal
INFO: Starting Servlet engine: [Apache Tomcat/9.0.69]
dic 06, 2022 6:13:18 PM org.apache.jasper.servlet.TldScanner 
scanJars
INFO: At least one JAR was scanned for TLDs yet contained no 
TLDs. Enable debug logging for this logger for a complete list of 
JARs that were scanned but no TLDs were found in them. Skipping 
unneeded JARs during scanning can improve startup time and JSP 
compilation time.
dic 06, 2022 6:13:18 PM 
org.apache.catalina.util.SessionIdGeneratorBase 
createSecureRandom
WARNING: Creation of SecureRandom instance for session ID 
generation using [SHA1PRNG] took [122] milliseconds.
dic 06, 2022 6:13:26 PM org.apache.jasper.servlet.TldScanner 
scanJars
INFO: At least one JAR was scanned for TLDs yet contained no 
TLDs. Enable debug logging for this logger for a complete list of 
JARs that were scanned but no TLDs were found in them. Skipping 
unneeded JARs during scanning can improve startup time and JSP 
compilation time.

Spring 5 不支持 Tomcat 10 但它在 Tomcat 9 上運行得很好。

事實上,我只是通過使用稍微固定的 POM 創建一個簡單項目並在 Tomcat 9.0.69 上運行它來測試它。

這是 POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>tomcat-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>tomcat-demo</name>
    <description>Demo project for Spring Boot</description>
    
    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-annotations-api</artifactId>
            <!--   <version>10.0.23</version>-->
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
            <!--  <version>2.0.0</version> -->
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <!--    <version>1.2</version> -->
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.hibernate.orm</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>6.1.5.Final</version>
            <type>pom</type>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <!--   <version>6.0.0</version> -->
            <scope>provided</scope>
        </dependency>

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

            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <!--     <version>4.13.2</version>-->
            <scope>provided</scope>

        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <!-- <version>5.3.23</version> -->
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <scope>provided</scope>
        </dependency>

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

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

        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>el-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        
        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <!--  <version>2.0.0</version>  -->
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.security.enterprise</groupId>
            <artifactId>javax.security.enterprise-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <!--    <version>42.5.0</version> -->
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <!--  <version>2.7.3</version>-->
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <!--  <version>2.7.4</version>-->
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
            <!-- <version>2.7.4</version>-->
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.vladmihalcea</groupId>
            <artifactId>hibernate-types-55</artifactId>
            <version>2.14.0</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <!--  <version>3.2.0</version> -->
                <!--  <scope>provided</scope> -->
            </plugin>
        </plugins>

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

</project>

另一件需要注意的事情是,您的項目中必須有一個SpringBootServletInitializer的實現來初始化 Tomcat 所需的 Servlet 上下文。您可以使您的@SpringBootApplication (或任何@Configuration )擴展SpringBootServletInitializer或使其成為一個單獨的 class:

public class ServletInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(YourSpringBootApplication.class);
    }
}

暫無
暫無

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

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