漫漫搬砖路

导航

记一次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,总算没有报错了.

  

posted on 2017-12-21 15:58  漫漫搬砖路  阅读(140)  评论(0编辑  收藏  举报