一、报错IllegalArgumentException: 找到多个名为[spring_web]的片段。这是不合法的相对排序
在运行 SpringMVC项目的时候,出现了报错 IllegalArgumentException: 找到多个名为[spring_web]的片段。这是不合法的相对排序,具体如下:
Caused by: java.lang.IllegalArgumentException: 找到多个名为[spring_web]的片段。这是不合法的相对排序。有关具体信息,请参阅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版本。项目目次截图如下:
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,我临时不想去办理了。有这一个能用就先使用着。
总之,这些依赖之间的关系标题以及导致的报错标题真的是挺烦人的。需要有耐心好好地排查啊。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |