找到多个名为[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]