为什么javaassist抛出无效的常量类型:18只在项目

时间:2017-01-18 16:44:24

标签: java

在发布此特定问题之前,我读了很多QnA。回答了大多数 javaassist无效常量18 问题,以升级 javaassist lib。基于这些QnA,我还在我的项目中将lib升级到最新版本,它确实有效。但是,如果可以的话,我不理解关注并需要某人帮助才能提供一些见解:

这是环境

当前版本: JDK:build 1.8.0_92-b14

javaassist:3.14.0.GA

Hibernate:3.5.1-Final

构建用途:Ant

截止日期项目代码中没有lamda或stream。 代码构建和运行成功。到目前为止没有问题。

现在,当我使用Lambdas和Streams时会发生这种情况。

案例1:没有javaassist升级 现在,只要我在同一个项目中介绍任何Lamda和Stream,然后关注 在Spring容器启动时,特别是在服务器启动期间抛出异常。 奇怪的是,根据IoC容器中显示的日志,Lambda和Stream确实初始化了没有问题的类,但是尝试启动EntityYmanager的现有bean之一获得了运行时异常。 基于QnA评论之一谈论

案例2 :只要将java辅助版升级到最新版本(或 3.17.0-GA 以上的任何内容),一切正常。

问题:为什么在拥有Lambdas的类中没有抛出异常,但现有的hibernate的Entitity Manager在项目没有任何lambda / stream时工作正常?在抛出此异常时,已成功加载lambda的Infact Bean和容器内部。

有人可以解释一下吗?

以下是完整的错误跟踪:

org.springframework.beans.factory.BeanCreationException: Error creating bean     
with name 'ldbEntityManagerFactory' defined in ServletContext resource  
[/WEB-INF/spring/JPA.xml]: Invocation of init method failed; nested     
exception is java.lang.RuntimeException: Error while reading   
    file:/C:/home/tcserver/profiles/instance/webapps/app/WEB-INF/classes
    -------deleted--------------
    ... 25 more
    **Caused by: java.io.IOException: invalid constant type: 18**
    at javassist.bytecode.ConstPool.readOne(ConstPool.java:1090)
    at javassist.bytecode.ConstPool.read(ConstPool.java:1033)
    at javassist.bytecode.ConstPool.<init>(ConstPool.java:149)
    at javassist.bytecode.ClassFile.read(ClassFile.java:764)
    at javassist.bytecode.ClassFile.<init>(ClassFile.java:108)
    atorg.hibernate.ejb.packaging.AbstractJarVisitor.checkAnnotationMatching(Abs
    tractJarVisitor.java:236)
    atorg.hibernate.ejb.packaging.AbstractJarVisitor.executeJavaElementFilter(Ab
    stractJarVisitor.java:202)
    aorg.hibernate.ejb.packaging.AbstractJarVisitor.addElement(AbstractJarVisito
    r.java:163)
    aorg.hibernate.ejb.packaging.ExplodedJarVisitor.getClassNamesInTree(Exploded
    JarVisitor.java:101)
    ----DELETED---       
    g.hibernate.ejb.Ejb3Configuration.scanForClasses(Ejb3Configuration.java:614)
    ... 31 more

1 个答案:

答案 0 :(得分:4)

无法创建EntityManager实例,因为管理器正在加载的类失败。然后它不是管理器的javassist问题,而是由它加载的类。因此,完全有可能有一次没有问题创建管理器(在使用中没有lambda)和一次失败(使用lambdas)。错误消息表明旧的javaassist版本不了解invokedynamic指令,这意味着它是一个pre Java7版本。只有Java7中的java本身才使用该指令,这使得问题完全可能只出现在java8代码中。 lambdas正在使用invokedynamic。