【问题标题】:cglib is causing a java.lang.VerifyError during query generation in Intuit Partner Platform Java SDKcglib 在 Intuit 合作伙伴平台 Java SDK 中的查询生成期间导致 java.lang.VerifyError
【发布时间】:2014-01-11 05:53:20
【问题描述】:

我不知道是什么导致了这个错误。

我正在使用 Intuit 的 Java v3 SDK for QuickBooks Online (QBO),并且我正在尝试对 TimeActivity 对象运行查询。为此,我必须生成一个查询实体。

我的代码在这一行失败:

TimeActivity queryTimeActivity = GenerateQuery.createQueryEntity(TimeActivity.class);

堆栈跟踪从该行开始,如下所示:

java.lang.VerifyError: class net.sf.cglib.core.DebuggingClassWriter overrides final method visit.(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
    at com.google.appengine.runtime.Request.process-4da1515b5814ac28(Request.java)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:795)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:360)
    at net.sf.cglib.core.AbstractClassGenerator.<init>(AbstractClassGenerator.java:38)
    at net.sf.cglib.core.KeyFactory$Generator.<init>(KeyFactory.java:127)
    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:112)
    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
    at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
    at com.intuit.ipp.query.GenerateQuery.createQueryEntity(GenerateQuery.java:56)

我应该提到,此代码位于 Google App Engine 应用程序中。我对这个错误做了一些谷歌搜索,发现很多人建议从构建路径中删除库“cglib”和“asm”。我找不到“cglib”,但我尝试删除“asm-4.0.jar”,但 Google App Engine 在我尝试时抱怨。更具体地说,应用程序已部署,但当我删除 asm.jar 时,相关行从未运行。

有人有什么想法吗?我无法让我的代码超出上述行。

【问题讨论】:

  • 我对因纽特人的 Java SDK 不熟悉。那是JDK吗?如果是这样,为什么你必须使用他们的 SDK?为什么不能只使用标准的 JDK?
  • 这是一个便于调用 Intuit 的 QuickBooks Online API 的库。

标签: java google-app-engine intuit-partner-platform quickbooks-online cglib


【解决方案1】:

请注意,在调用 cglib 的 Enhancer 类的静态初始化程序 (&lt;clinit&gt;) 期间会引发异常。 Cglib 在内部使用 ASM,并且您的类路径中的 cglib 和 ASM 版本似乎不匹配。

从错误中,我认为 Intuit 正在使用依赖 ASM 3.1 的 cglib 2.2。在this version 中,ClassWriter 没有将其方法声明为final。这在ASM 4 中发生了变化,因此无法加载 cglib,因为它现在覆盖了这些 final 方法。

你可以做的是要么

  1. 从类路径中删除 ASM 4,但添加 ASM 3。有关 cglib 2.2.2 需要 ASM 3.1.1 的事实,请参阅 POM。
  2. 将 cglib 3.1 显式添加到适用于 ASM 4 的类路径中。但这可能会破坏使用 cglib 的应用程序。

通常,使用 ASM 的库应该将后者打包在不同的包中,以避免 zhis 问题,如 ASM 的FAQ 中所述。似乎 Intuit 的作者错过了这一点。

最后,请注意它提到 here 表示 GAE 仅部分支持 cglib 2.2。

【讨论】:

  • 感谢您的详细信息。似乎 Intuit 的作者错过了很多东西。我发现 Intuit 合作伙伴平台非常有问题。无论如何,我在没有 GenerateQuery 帮助的情况下编写自己的查询字符串,完全绕过了这个问题。
  • 不客气。如果您的问题得到解决,请考虑标记答案并为您认为有帮助的任何答案投票。
【解决方案2】:

我尝试了以下方法,效果很好。

TimeActivity timeActivity = GenerateQuery.createQueryEntity(TimeActivity.class);
String query   = select($(timeActivity.getId()),$(timeActivity.getSyncToken())).generate();
System.out.println("Generated Query - " + query);
QueryResult queryResult = service.executeQuery(query);

您能否检查它是否在您的本地系统中运行。

谢谢

【讨论】:

  • 它在我的本地系统上运行良好。当我将它部署到 Google App Engine 时它​​会中断。
  • 我最终手动编写了自己的查询字符串,因为 GenerateQuery 的全部目的是编写 SQL 字符串。绕过复杂的查询字符串生成器似乎少了很多麻烦。问题仍未得到诊断,但无论如何都被规避了。
【解决方案3】:

正如 raphw 上面解释的那样,选项 2 为我修复了它。在我的例子中,我使用了另一个包含 ASM 4 的工件。我在我的 POM 文件中添加了以下依赖项,但我不再收到错误消息:

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.1</version>
</dependency>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多