【问题标题】:java.lang.VerifyError: Incompatible argument to function (aspectj)java.lang.VerifyError:函数参数不兼容(aspectj)
【发布时间】:2013-06-12 21:42:12
【问题描述】:

概要:我正在尝试向我的域模型添加环绕建议,但由于奇怪的验证错误,我的应用不会部署到 tomcat。

约束:LTW 在这里不是一个选项,所以我使用 aspectj-maven-plugin 来提供 CTW。

我正在使用 IntelliJ-Idea,我正在部署一个爆炸式战争,我使用 maven (mvn clean install -DskipTests) 在命令行上构建它。我已经禁用了 IntelliJ 的自动生成,所以唯一发生的编译是通过命令行。

当我部署我的应用程序时,我得到以下堆栈跟踪:

java.lang.VerifyError: (class: org/chaosengineers/ddd/services/PersistenceService, method: persistNewWord signature: (Ljava/lang/String;)Lorg/chaosengineers/ddd/photons/WordStorePhoton;) Incompatible argument to function
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2398)
    at java.lang.Class.getDeclaredConstructors(Class.java:1838)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:230)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:972)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:945)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:487)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:910)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:853)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:795)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:723)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1045)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:949)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:487)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:910)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:853)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:795)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:723)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1045)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:949)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:487)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4887)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5381)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1553)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:762)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:622)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:569)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:762)
    at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1454)
    at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:74)
    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1295)
    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1387)
    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:818)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:303)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:680)

【问题讨论】:

    标签: java intellij-idea aspectj


    【解决方案1】:

    VerifyError 可能是在类路径中找到的库版本与用于编译的库版本不同的结果。请检查您的任何库(包括 aspectjrt.jar 以及其他库)是否可能出现这种情况。您的调用堆栈中没有 AspectJ 的东西,所以也许它根本与此无关。

    P.S.:(题外话)使用这种过时的 AspectJ 版本的原因是什么?

    【讨论】:

    • 我正在使用 maven aspectj 插件,它使用旧版本的 aspectj。我不确定它是不是已经过时了——它只是一个小版本。
    • 你为什么不赞成我的回答?我仍然认为这可能是正确的。请证明相反的情况。
    • 对不起@kriegaex,我的两个cmets(上图)都是针对你的答案的。堆栈跟踪清楚地表明错误是由我自己的一个类(org.chaosengineers——类定义可通过源链接获得)产生的。而且,我清楚地说我正在通过 maven 编译一次代码,并通过 intellij 将其部署到位(作为一场爆炸战争),而无需进一步编译。因此,它不可能是一个简单的版本控制问题。我对答案投了反对票,因为考虑到这个问题,这不是一个可能的解释。
    【解决方案2】:

    它实际上看起来像一个弹簧配置错误。发生的事情是 spring 正在尝试连接 bean 并且无法找到适合的构造函数。

    看起来它正在尝试自动连接 PersistenceService。我认为它需要一个字符串,但它却得到了一个 WordStorePhoton。 (或相反)。

    (类:org/chaosengineers/ddd/services/PersistenceService,方法:persistNewWord 签名:(Ljava/lang/String;)Lorg/chaosengineers/ddd/photons/WordStorePhoton;)

    我建议不要对这个特定的 bean 使用 @autowire,而是快速创建一个 spring 配置文件并明确定义 bean。

    但肯定是 Spring 导致了错误。它正在尝试创建 bean,但找不到正确的构造函数。

    【讨论】:

    • 感谢@Eric,我刚刚尝试过,但完全没有区别。我对你为什么认为这是一个弹簧/构造函数问题感兴趣?我很感兴趣,因为这正是我通过在方面放置 [at]Component 注释解决的上一个问题的确切性质。
    • @EngineerDollery,当我阅读堆栈跟踪时,Spring 在 Autowire 上失败了。因此,当它自动装配时,它使用反射来查找类的构造函数,您可以在堆栈跟踪的顶部看到它。在您的情况下,它似乎找到了构造函数,但无法通过签名找到匹配项,因此您看到了错误。
    • @EngineerDollery,关于接口:啊,我想我以为你在使用接口。这是使用 DI 时相当标准的做法。这个 SO 问题部分有帮助 stackoverflow.com/questions/12899372/… 但是在使用 DI 时,您确实希望使用接口,因为这使您能够在运行时交换实现,这是 DI 的最大好处之一。
    • 是的,你当然是对的。结果发现问题不在我的真实系统中。我拼凑了一个快速原型(“玩具”)系统来学习如何配置 CTW,而无需在我的日常工作系统中进行操作,当然我会不假思索地偷工减料,因为真正的工程“严谨” ' 没有必要 :) 感谢您的帮助。
    【解决方案3】:

    好的,经过几天的努力,我想我找到了正确的答案。当我为我的服务引入接口时,问题就消失了。因此,我认为编译器(javac 或 ajc,但很可能是后者)正在破坏字节码中的 vtable,但接口的引入以某种方式纠正了问题。我还没有去反编译字节码来证明这是实际发生的事情,但事实仍然是引入接口解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2016-10-15
      相关资源
      最近更新 更多