老系统使用的是Spring2.5.5,准备把老系统换到新的服务器上,安装好了新版的JDK11,却发现无法启动tomcat,查看tomcat/logs/catalina.out的日志:
Unexpected exception parsing XML document from class path resource [applicationContext-dao.xml]; nested exception is java.lang.IllegalStateException: Context namespace element 'annotation-config' and its parser class [org.springframework.context.annotation.AnnotationConfigBeanDefinitionParser] are only available on JDK 1.5 and higher Caused by: java.lang.IllegalStateException: Context namespace element 'annotation-config' and its parser class [org.springframework.context.annotation.AnnotationConfigBeanDefinitionParser] are only available on JDK 1.5 and higher
发现Spring居然监测到的JDK版本是1.5以下。
如果要换Spring的话,老系统不知道要改写什么东西,工程量比较大,找到网上一个解决方案(是解决1.8的JDK的,我稍加修改了下,解决1.8以上全部的JDK),总体思路是修改Spring判断JDK版本的类,重新编译并覆盖掉原来的。
在项目中,创建org.springframework.core这个package,然后新建一个类:JdkVersion.java,内容如下:
/* * Copyright (c) 2021. * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.springframework.core; /** * @author Terry E-mail: yaoxinghuo at 126 dot com * @date 2021-6-25 14:19 * @description */ public class JdkVersion { public static final int JAVA_13 = 0; public static final int JAVA_14 = 1; public static final int JAVA_15 = 2; public static final int JAVA_16 = 3; public static final int JAVA_17 = 4; private static final String javaVersion = System.getProperty("java.version"); private static final int majorJavaVersion; public static String getJavaVersion() { return javaVersion; } public static int getMajorJavaVersion() { return majorJavaVersion; } public static boolean isAtLeastJava14() { return true; } public static boolean isAtLeastJava15() { return getMajorJavaVersion() >= 2; } public static boolean isAtLeastJava16() { return getMajorJavaVersion() >= 3; } static { if (javaVersion.indexOf("1.7.") != -1) { majorJavaVersion = 4; } else if (javaVersion.indexOf("1.6.") != -1) { majorJavaVersion = 3; } else if (javaVersion.indexOf("1.5.") != -1) { majorJavaVersion = 2; } else { majorJavaVersion = 5; //修改这里,监测JDK,都当成高版本1.8以上,相信也不可能找到再旧版的JDK了! } } }
重新编译了一下,在 build/classes/org/springframework/core/JdkVersion.class 这里找到JdkVersion.class,然后用解压缩软件打开项目的lib目录里的spring-2.5.5.jar,把里面的org/springframework/core里的JdkVersion.class替换成我们编译出来的,再放回原来的lib下,就可以顺利启动Tomcat啦!
如果你懒得编译,我已经把编译修改好的spring.2.5.5.jar传到github上了,供有需要的下载:
文章评论