版权声明:转载请注明出处 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的全部依赖关系图,如图
然后ctrl+f搜索c3p0,出来两个,如下图
发现原来是quartz这个包下多了,右键选中它选择Exclude掉,对应的pom.xml就已经成功修改了,如下图
进入项目根目录打开命令窗口,输入maven命令:mvn clean package -Dskiptests
(删除,打包,编译,测试,跳过test文件)来测试,如下图
进入target目录,打开war,进入lib,发现只有一个c3p0jar包了
如果还是有两个,说明可能没clean完全,就在pom.xml加入warSourceExcludes,忽略掉WEB-INF下面的文件
- warSourceExcludes是在拷贝文件到war文件夹时忽略掉指定文件或者文件夹(但是如果war命令前没有clean指令,而war文件夹下已经包含了指定文件或者文件夹时,最后生成的war包里还是会包含这些文件或文件夹,哪怕没有拷贝它们到war文件夹).
- packagingExcludes是在生成war包时不包含指定文件或文件夹到war文件中,不论它们是否存在于war文件夹下。
如下图:
总结
需要加强了解下maven了
更多精彩文章请关注