invalid constant type: 15 at 79


项目运行test,之前一直ok,突然某一天报错了

错误信息

java.io.IOException: invalid constant type: 15 at 79
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:321)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
	at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:128)
	at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
	at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:108)
	at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:251)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
	... 24 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cmIdentifyRelationService': FactoryBean threw exception on object creation; nested exception is java.lang.RuntimeException: java.io.IOException: invalid constant type: 15 at 79
	at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:175)
	at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:103)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1634)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:254)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:522)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:496)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:627)
	at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:169)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:318)
	... 40 more
Caused by: java.lang.RuntimeException: java.io.IOException: invalid constant type: 15 at 79
	at javassist.CtClassType.getClassFile2(CtClassType.java:204)
	at javassist.CtClassType.subtypeOf(CtClassType.java:304)
	at javassist.CtClassType.subtypeOf(CtClassType.java:319)
	at javassist.compiler.MemberResolver.compareSignature(MemberResolver.java:235)
	at javassist.compiler.MemberResolver.lookupMethod(MemberResolver.java:107)
	at javassist.compiler.MemberResolver.lookupMethod(MemberResolver.java:84)
	at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:711)
	at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:688)
	at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:157)
	at javassist.compiler.ast.CallExpr.accept(CallExpr.java:46)
	at javassist.compiler.JvstTypeChecker.atCastToWrapper(JvstTypeChecker.java:126)
	at javassist.compiler.JvstTypeChecker.atCastExpr(JvstTypeChecker.java:98)
	at javassist.compiler.ast.CastExpr.accept(CastExpr.java:55)
	at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:242)
	at javassist.compiler.CodeGen.compileExpr(CodeGen.java:229)
	at javassist.compiler.CodeGen.atReturnStmnt2(CodeGen.java:598)
	at javassist.compiler.JvstCodeGen.atReturnStmnt(JvstCodeGen.java:425)
	at javassist.compiler.CodeGen.atStmnt(CodeGen.java:363)
	at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
	at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
	at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
	at javassist.compiler.CodeGen.atIfStmnt(CodeGen.java:391)
	at javassist.compiler.CodeGen.atStmnt(CodeGen.java:355)
	at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
	at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
	at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
	at javassist.compiler.MemberCodeGen.atTryStmnt(MemberCodeGen.java:204)
	at javassist.compiler.CodeGen.atStmnt(CodeGen.java:367)
	at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
	at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
	at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
	at javassist.compiler.CodeGen.atMethodBody(CodeGen.java:292)
	at javassist.compiler.CodeGen.atMethodDecl(CodeGen.java:274)
	at javassist.compiler.ast.MethodDecl.accept(MethodDecl.java:44)
	at javassist.compiler.Javac.compileMethod(Javac.java:169)
	at javassist.compiler.Javac.compile(Javac.java:95)
	at javassist.CtNewMethod.make(CtNewMethod.java:74)
	at javassist.CtNewMethod.make(CtNewMethod.java:45)
	at com.alibaba.dubbo.common.bytecode.ClassGenerator.toClass(ClassGenerator.java:322)
	at com.alibaba.dubbo.common.bytecode.ClassGenerator.toClass(ClassGenerator.java:293)
	at com.alibaba.dubbo.common.bytecode.Wrapper.makeWrapper(Wrapper.java:346)
	at com.alibaba.dubbo.common.bytecode.Wrapper.getWrapper(Wrapper.java:89)
	at com.alibaba.dubbo.config.ReferenceConfig.init(ReferenceConfig.java:269)
	at com.alibaba.dubbo.config.ReferenceConfig.get(ReferenceConfig.java:138)
	at com.alibaba.dubbo.config.spring.ReferenceBean.getObject(ReferenceBean.java:65)
	at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168)
	... 50 more
Caused by: java.io.IOException: invalid constant type: 15 at 79
	at javassist.bytecode.ConstPool.readOne(ConstPool.java:1044)
	at javassist.bytecode.ConstPool.read(ConstPool.java:984)
	at javassist.bytecode.ConstPool.<init>(ConstPool.java:125)
	at javassist.bytecode.ClassFile.read(ClassFile.java:770)
	at javassist.bytecode.ClassFile.<init>(ClassFile.java:114)
	at javassist.CtClassType.getClassFile2(CtClassType.java:191)
	... 95 more

排查过程

网上查到的原因:
javassist jar包版本太低,jdk1.8不支持,需要升级到3.20或以上
Java 8u11中的JVM字节码验证子系统发生变化而导致的。Java语言要求任何调用超类构造函数必须在第一次调用时进行,但Java早期版本中的字节码验证器并没有强制去验证。影响到了一些第三方工具,如javassist

处理方案

查项目的jar包依赖,有三个地方间接依赖到javassist,版本分别为3.16, 3.18, 3.21。猜想应该是用了3.16或3.18版本的jar包。
在项目本身的pom中直接引入对3.21版本的jar包依赖,运行test,正常,问题解决。其他方案,见参考资料中的maven依赖顺序原则
Q:三个版本jar包,为什么会引用到老版本的呢? 百度了下 maven依赖顺序原则,见后续内容

<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.21.0-GA</version>
    <scope>test</scope>
</dependency>

maven依赖顺序原则

  • first: 短路径优先

    • 如项目P1依赖了a和b两个jar包。a依赖t1.0,b依赖c, c依赖t1.1。由于t1.0路径最短,最终项目P1使用t1.0这个jar包
  • second: pom文件中申明顺序优化

    • 当同一个包依赖的路径一样时,优先使用pom文件中声明的jar包

参考资料

maven依赖顺序原则:https://www.cnblogs.com/shawWey/p/7417335.html
java8升级导致第三方工具不兼容:http://www.iteye.com/news/29231

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值