慢吞云雾缓吐愁 发表于 昨天 19:06

找到多个名为[spring_web]的片段、TldScanner.scanJars至少有一个JAR被扫描

一、报错IllegalArgumentException: 找到多个名为的片段。这是不合法的相对排序

        在运行 SpringMVC项目的时候,出现了报错 IllegalArgumentException: 找到多个名为的片段。这是不合法的相对排序,具体如下:
   Caused by: java.lang.IllegalArgumentException: 找到多个名为的片段。这是不合法的相对排序。有关具体信息,请参阅Servlet规范的第8.2.2 2c节。思量使用绝对排序。
        at org.apache.tomcat.util.descriptor.web.WebXml.orderWebFragments(WebXml.java:2275)
        at org.apache.tomcat.util.descriptor.web.WebXml.orderWebFragments(WebXml.java:2231)
        at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1252)
        at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:961)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:290)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4352)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
        ... 37 more
         这里出现这个标题的原因,是由于在pom.xml 中切换了 SpringMVC的版本,而在切换之前已经在项目布局里将扩展包文件导入到了 web 中,而切换之后 artifacts 下目次 WEB-INF\lib 中的扩展包并不会主动删除,从而导致目次中存在多个版本的  SpringMVC jar 包,从而引发了这个错误。
        所以办理的办法就是把 WEB-INF\lib 中的包扫除一下,重新导入一个包到 lib中。记住需要重新导入,不能光把目次扫除就完事。而且删除这些 jar包需要停一下 tomcat 服务器,不然文件在使用中无法删除。
二、org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包罗TLD。

        这个标题真的搞得很烦,org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包罗TLD。 Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 65。
        试了N多种情况,仍不能确定是哪里的标题,网上的很多答复和办理方法都并不能完全恰当,大概导致这种标题的原因有很多种。包括 MAVEN包的标题特别是 spring-webmvc 和 servlet-api 等这些依赖的版本标题、还有扩展导入 web 目次、JDK版本等,最后我 整理一个SpringMVC项目运行起来的完整配置和代码示例步伐。在这里也做个记录,以便以后有标题来排查。
#.  一个SpringMVC项目运行起来的完整配置和代码示例步伐

        先说一下情况,我这里是 IDEA 2024.1.6版本,JDK是IDEA中安装好的21版本,Maven也是IDEA中的3版本。项目目次截图如下:
https://i-blog.csdnimg.cn/direct/f5be9050e7df4336bf1a354a97d54d12.png
1. 接下来是 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>springmvc01</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
      <maven.compiler.source>21</maven.compiler.source>
      <maven.compiler.target>21</maven.compiler.target>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
      <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
      </dependency>
      <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.39</version>
      </dependency>
      <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
      </dependency>
      <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
      </dependency>
      <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
      </dependency>
    </dependencies>

    <build>
      <!--maven静态资源过滤-->
      <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                  <include>**/*.properties</include>
                  <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                  <include>**/*.properties</include>
                  <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
      </resources>
    </build>

</project> 2. web.xml配置文件内容

        这些文件包括下面的 springmvc-servlet.xml 并没有什么特殊的,其实现在在IDEA中直接编辑也能写出来,不外放这里保存,以后有需要也可以直接复制。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
      </init-param>
    </servlet>
    <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app> 3. springmvc-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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
   
<!--    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />-->
<!--    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />-->

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/jsp/" />
      <property name="suffix" value=".jsp" />
    </bean>

<!--    <bean id="/index" class="org.example.controller.IndexController" />-->
    <context:component-scan base-package="org.example.controller" />
    <mvc:default-servlet-handler />
    <mvc:annotation-driven />
</beans> 4. IndexController 中的代码内容

        和上方的 springmvc-servlet.xml 一样,也是将非注解的方式实现的代码解释了,可以方便切换测试。 
package org.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//public class IndexController implements Controller {
//
//    @Override
//    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//      ModelAndView mv = new ModelAndView();
//      mv.setViewName("index");
//      return mv;
//    }
//}

@Controller
public class IndexController{

    @RequestMapping("/index")
    public String hello(Model model){
      model.addAttribute("msg", "Hello World");
      return "index";
    }


} 5. 最后是 index.jsp 的内容

        这里如果在调试的时候视图出错,可以不用视图加载,直接使用RestController 返回内容即可。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${msg}
</body>
</html>
6. 其它 Tomcat 的配置

        我这里有两个版本,包括 Tomcat9和  Tomcat10 版本,两个版本切换着使用,现在是使用的  Tomcat9 两种方式都能成功运行。Tomcat 10下报错:org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包罗TLD,我临时不想去办理了。有这一个能用就先使用着。
https://i-blog.csdnimg.cn/direct/115c658464df4b78880091e7d67e25ac.png
        总之,这些依赖之间的关系标题以及导致的报错标题真的是挺烦人的。需要有耐心好好地排查啊。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 找到多个名为[spring_web]的片段、TldScanner.scanJars至少有一个JAR被扫描