Spring3.X jdk8 java.lang.IllegalArgumentException

本文分析了Spring MVC在启动过程中遇到的异常问题,详细展示了异常堆栈信息,并提供了两种解决方案:一是更换JDK版本到1.7或更低;二是升级到Spring 4.0 RELEASE或以上版本。

异常提示:

复制代码
 1 javax.servlet.ServletException: Servlet.init() for servlet springMVC threw exception
 2     org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
 3     org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
 4     org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
 5     org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
 6     org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
 7     org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
 8     org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466)
 9     org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455)
10     java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
11     java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
12     org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
13     java.lang.Thread.run(Thread.java:745)
14 
15 root cause
16 
17 java.lang.IllegalArgumentException
18     org.springframework.asm.ClassReader.<init>(Unknown Source)
19     org.springframework.asm.ClassReader.<init>(Unknown Source)
20     org.springframework.asm.ClassReader.<init>(Unknown Source)
21     org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
22     org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
23     org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:102)
24     org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
25     org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
26     org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
27     org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
28     org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
29     org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
30     org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
31     org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
32     org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
33     org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
34     org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
35     org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:652)
36     org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:600)
37     org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:666)
38     org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:519)
39     org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:460)
40     org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
41     javax.servlet.GenericServlet.init(GenericServlet.java:158)
42     org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
43     org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
44     org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
45     org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
46     org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
47     org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
48     org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466)
49     org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455)
50     java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
51     java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
52     org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
53     java.lang.Thread.run(Thread.java:745)
复制代码

解决办法:

一:把jdk版本换成1.7 or 1.7以下

二:使用spring 4.0RELEASE及以上版本

在 Eclipse 中出现 `Caused by: java.lang.IllegalArgumentException` 错误通常与运行时传入了不合法的参数有关,尤其是在使用 Spring 框架、Tomcat 或其他 Java EE 技术栈时较为常见。以下是可能的原因及对应的解决方法。 ### 一、Spring 框架中 IllegalArgumentException 的原因及解决方法 #### 1. **Spring 版本与 JDK 版本不兼容** 使用 Spring 3.2.3.RELEASE 版本时,虽然理论上支持 JDK 1.8,但在某些特定的 ASM 类操作中可能仍然存在问题。`ClassReader` 是 ASM 框架的一部分,Spring 使用其进行类字节码分析。 - **解决方法**: - 升级 Spring 框架至更高版本,例如 Spring 4.x 或 Spring 5.x,以获得更好的 JDK 1.8 支持。 - 如果无法升级 Spring,尝试降级 JDK 至 1.7 或以下版本。 #### 2. **注解处理异常** Spring 在处理注解(如 `@Component`, `@Service`)时,若类文件格式异常或包含非法元数据,也可能导致 `IllegalArgumentException`。 - **解决方法**: - 清理项目并重新编译,确保没有损坏的 `.class` 文件。 - 检查是否有重复的类文件或冲突的依赖。 - 使用 Maven 或 Gradle 的 clean 命令清除缓存并重新构建项目。 #### 3. **依赖冲突** 多个版本的 ASM 或 Spring 库共存可能导致类加载异常。 - **解决方法**: - 使用 `mvn dependency:tree` 或 Gradle 的依赖分析工具检查依赖树。 - 排除冲突的依赖项,确保只使用一个版本的 ASM 和 Spring。 ### 二、Tomcat 启动时报 IllegalArgumentException: MALFORMED #### 1. **包含非法字符的类文件名** 如引用所述,Tomcat 在处理 `@WebServlet` 等注解时会扫描 `WEB-INF/lib` 下的 JAR 包。如果其中包含中文或其他非法字符的文件名,会导致 `processAnnotationsJar` 方法抛出异常。 - **解决方法**: - 找出包含非法字符的 JAR 包或类文件,重命名文件或路径为英文。 - 在 Tomcat 的源码中添加日志输出,定位具体出错的文件,如引用中所述修改 `ContextConfig` 类中的 `processAnnotationsJar` 方法。 #### 2. **JAR 包损坏或打包方式问题** 使用 `zip` 命令打包可能导致编码或结构问题,进而引发类加载异常。 - **解决方法**: - 使用标准的构建工具(如 Maven 或 Gradle)进行打包。 - 避免使用非标准压缩工具进行 WAR/JAR 文件的打包。 ### 三、通用排查方法 #### 1. **启用详细日志** 在 `log4j.properties` 或 `logging.properties` 中启用 Spring 和 Tomcat 的详细日志输出,帮助定位异常源头。 #### 2. **使用断点调试** 在 Eclipse 中配置远程调试或本地调试,设置断点跟踪异常抛出的具体位置。 #### 3. **检查环境变量** 确保 `JAVA_HOME`、`PATH` 等环境变量指向正确的 JDK 安装路径,避免不同版本的 JDK 混用。 --- ### 示例代码:添加日志输出以定位 Tomcat 异常文件 ```java // 在 ContextConfig 类的 processAnnotationsJar 方法中添加日志 public void processAnnotationsJar(Jar jar, URL jarUrl, WebXml webXml) { try { // ... } catch (IllegalArgumentException e) { System.err.println("Error processing JAR file: " + jarUrl); // 输出出错的 JAR 文件 throw e; } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值