1.老项目使用 hibernate 的框架,entry 层主键 id 使用的是 Integer 类型.代码如下:
	...
    @Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
    ...
2.接口里面调用 getId 的时候会报 java.lang.NoSuchMethodError 的错误.
	adviserChanges.setService_log_id(serviceLog.getId());
3.报错信息如下:
java.lang.NoSuchMethodError:cn.xxx.xxx.xxx.modules.studyservice.entity.ServiceLog.getId()I
 atcn.xxx.xxx.bj.modules.auslocal.service.AssignBigClassStudentService.assignAdviser(AssignBigClassStudentService.java:371)
 atcn.xxx.bpm.bj.modules.auslocal.service.AssignBigClassStudentService$$FastClassByCGLIB$$d542d115.invoke(<generated>)
4.刚开始猜测是不是因为编译有问题,后来反编译了.class 文件,发现反编译之后是有 getId 这个方法的. 而且测试环境和本地都是好使得,但是线上就出问题了.
|      1TtTtTtT      2022-03-01 16:06:59 +08:00 .getId()I 里的 I 是基础类型,你的 Java 代码是包装类。怎么改就布吉岛了。。 | 
|      2Jooooooooo      2022-03-01 16:07:55 +08:00 包冲突了, 你全局搜搜 modules.studyservice.entity.ServiceLog 这个是不是别的 jar 也有这个路径的方法. | 
|  |      3jiobanma OP | 
|      4Jooooooooo      2022-03-01 16:14:58 +08:00 @jiobanma 说的是依赖的 jar | 
|  |      5wolfie      2022-03-01 16:18:16 +08:00 用 arthas 运行时反编译 | 
|  |      6jiobanma OP @Jooooooooo 查过了 没有其他地方使用 | 
|  |      7jiobanma OP | 
|  |      8jiobanma OP @Jooooooooo  @TtTtTtT @wolfie 有没有可能是 改动了 ServiceLog 这个 entity 的 id 数据类型(之前是 int 的),但是 service 层没有代码改动, service 层的.class 文件没有重新编译,但是 entity 重新编译了,所以导致的. | 
|  |      9Junzhou      2022-03-01 17:24:17 +08:00 mvn clean ,然后重新打包。 | 
|  |      10lsk569937453      2022-03-01 17:25:32 +08:00 把 target 目录删了,重新编译一下项目 | 
|  |      11mosliu      2022-03-01 17:32:53 +08:00 一般整体重新编译重新部署最简单。 另外 检查下调用的包名 和 getId 的包名确定一致么 | 
|  |      12mosliu      2022-03-01 17:37:38 +08:00 还有看看 jdk 版本是否兼容? 考虑 jdk9+的模块化特性 没暴露? | 
|      13chenshun00      2022-03-01 17:42:41 +08:00 去 lib 目录看看有没有重复的 jar 包吧,一般都是这个原因,或者是加载到了别人的类 | 
|  |      14jiobanma OP @TtTtTtT  @Jooooooooo @wolfie @Junzhou @lsk569937453 @mosliu @chenshun00 感谢各位大佬,基本确定问题了,线上的 jenkins 打包的脚本有问题,应该是 mvn 那边只对修改过的类进行编译,并没对引用的类进行编译导致的. |