记一次JDK升级带来的连环反应
公司之前有个很久以前的小项目,页面用到了flash. 现在要去掉flash, 前端使用公司自己开发的框架来展示数据, 使用该框架后台要引用一个jar包封装数据传递给前台. 但该框架是jdk1.8编译的,那个老项目用的还是1.5,因此一开始因为编译环境不一致报了以下错误: Unsupported major.minor version 52.0 .
于是将老项目改为用jdk1.8编译,这时发现老项目调用的sun.net.ftp.FtpClient报错, 原来是因为FtpClient在jdk1.7后, 构造函数私有化了, 方法也变了.因为这个调用FtpClient类很久以前就不在使用了,就直接去掉了. 解决这个问题后,部署到tomcat,没有报错,但是访问jsp时,页面无法编译,报了如下错误:
org.apache.jasper.JasperException: Unable to compile class for JSP:
后台报错如下:
org.apache.jasper.compiler.JDTCompiler$1 findType 严重: Compilation error org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
网上查原因说是tomcat版本太低了, 这个老项目原来使用的是tomcat6, 于是我改为使用tomcat7部署.结果又报了另外一个错误:
org.apache.catalina.core.ContainerBase addChildInternal 严重: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/ServiceMonitoring]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:153) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:679) at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1966) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.NullPointerException at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:142) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5604) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) ... 10 more
继续查原因, 针对这个问题,网上一般有以下解决方式:
1:tomcat版本太高,改成tomcat6(...Fxxk,我刚因为另外的问题从tomcat6改成tomcat7);
2:web.xml有问题,检查<servlet>中的<servlet-name>和<servlet-mapping>中的<servlet-name>是否一致(...没错,没动过web.xml);
3:web.xml有问题,<servlet-mapping>中的<url-pattern>是否带了"/" (没动过web.xml);
最后又找到一个说法是spring版本太低了,要换新版本的,我看了下那个项目的spring,是3.1.0版本的,确实挺老的, 于是找了个4.2.5的,果然没报这个错误的,但是....又有了新的错误:
Caused by: java.lang.NoClassDefFoundError: org/quartz/impl/JobDetailImpl at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671) at java.lang.Class.getConstructor0(Class.java:3075) at java.lang.Class.getDeclaredConstructor(Class.java:2178) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:80) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1098) ... 33 more Caused by: java.lang.ClassNotFoundException: org.quartz.impl.JobDetailImpl at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1891) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1734) ... 39 more
原来是spring4.1.x版本后,MethodInvokingJobDetailFactoryBean类发生了改变,在初始化JobDetail的时候,需要new JobDetailImpl类. 于是又将sping的版本改为4.0.0,总算没有报错了.