java.lang.AbstractMethodError: Method com/mchange/v2/c3p0/impl/NewProxyPreparedStatement.isClosed()Z

版权声明:转载请注明出处 https://blog.csdn.net/EdwardDrew/article/details/85230822

前言

早上回来查看日志,发现job项目有报错,发现是c3p0jar包冲突问题,解决问题过程如下

正文

看报错日志,RazCourseOpenJob报错了,这个是上周我写的代码,在本地没报错,怎么会上线之后报错了?一看Unknown Source,开始猜测难道引用的方法没有?然后打开线上项目的lib包路径,一眼看到有两个c3p0的jar包,嗯?这就奇怪了,为什么之前都没报错?。应该是之前没有用到mybatis,这个项目是第一次用mybatis就报错了。问题就来了,我用idea本地测试的时候也没报错啊。猜测应该是在我本机跑的时候用的是最新版的那个jar包,而线上用的是旧的jar包。为什么没新版本不会覆盖旧版本?(因为jar包路径不一样)

[2018-12-24 02:00:00][pool-54-thread-1][ERROR] com.i61.job.component.JobService.runJob(JobService.java:59) - runJob error,jobId=20181224021829
java.lang.AbstractMethodError: Method com/mchange/v2/c3p0/impl/NewProxyPreparedStatement.isClosed()Z is abstract
	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.isClosed(NewProxyPreparedStatement.java)
	at org.apache.ibatis.executor.BaseExecutor.closeStatement(BaseExecutor.java:285)
	at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:52)
	at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
	at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
	at com.sun.proxy.$Proxy33.update(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:294)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:63)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
	at com.sun.proxy.$Proxy43.updateNextCourseOrder(Unknown Source)
	at com.i61.job.service.raz.RazCourseOpenJob.run(RazCourseOpenJob.java:32)
	at com.i61.job.component.JobService.runJob(JobService.java:49)
	at com.i61.job.component.JobInit$1.run(JobInit.java:62)
	at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
	at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

既然是jar包冲突,那就来解决吧
idea打开maven project窗口,选中项目右键选中show dependencies(或show dependencies popup),会出来该module的全部依赖关系图,如图
idea查找maven包冲突0.png
然后ctrl+f搜索c3p0,出来两个,如下图
idea查找maven包冲突1.png

发现原来是quartz这个包下多了,右键选中它选择Exclude掉,对应的pom.xml就已经成功修改了,如下图
Exclude.png
pom.xml.png

进入项目根目录打开命令窗口,输入maven命令:mvn clean package -Dskiptests(删除,打包,编译,测试,跳过test文件)来测试,如下图
idea查找maven打包查看jar包命令.png

进入target目录,打开war,进入lib,发现只有一个c3p0jar包了
idea查找maven包冲突4.png

如果还是有两个,说明可能没clean完全,就在pom.xml加入warSourceExcludes,忽略掉WEB-INF下面的文件

  • warSourceExcludes是在拷贝文件到war文件夹时忽略掉指定文件或者文件夹(但是如果war命令前没有clean指令,而war文件夹下已经包含了指定文件或者文件夹时,最后生成的war包里还是会包含这些文件或文件夹,哪怕没有拷贝它们到war文件夹).
  • packagingExcludes是在生成war包时不包含指定文件或文件夹到war文件中,不论它们是否存在于war文件夹下。
    如下图:
    idea pom配置.png

总结

需要加强了解下maven了


更多精彩文章请关注

猜你喜欢

转载自blog.csdn.net/EdwardDrew/article/details/85230822