【问题标题】:java.lang.VerifyError ,after datanucleus enahncement of classesjava.lang.VerifyError ,在类的数据核增强之后
【发布时间】:2018-12-23 07:31:05
【问题描述】:

我正在将我的 appengine-project 从 ant build 迁移到 maven,我使用带有 JDO 2 的 java 8 和用于类增强的 maven-datanucleus 插件和 maven appengine-plugin 1.9.64。但是在运行项目时,它会给出java.lang.VerifyError: Expecting a stackmap frame at branch target 15 error。如果我在没有数据核增强的情况下运行,它会给出类没有增强的错误。所以我假设数据核可能有问题.. 任何建议都将不胜感激。

访问 /home 时出现问题。原因:

Server Error

原因:

java.lang.VerifyError:在分支目标 15 处期望堆栈图帧 异常详情: 地点: com/project1/datastore/DbAppointment.jdoSetkey(Lcom/dhiti/care/server/datastore/DbAppointment;Lcom/google/appengine/api/datastore/Key;)V @4: ifnonnull 原因: 此位置的预期堆栈图帧。 字节码: 0x0000000: 2ab4 0339 c700 0b2a 2bb5 032e a700 142a 0x0000010: b403 392a 1017 2ab4 032e 2bb9 04cd 0500 0x0000020: b1

at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.sun.proxy.$Proxy14.<clinit>(Unknown Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:739)
at com.google.inject.internal.ConstructionContext.createProxy(ConstructionContext.java:77)
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:69)
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at com.google.inject.Scopes$1$1.get(Scopes.java:65)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:54)
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at com.google.inject.Scopes$1$1.get(Scopes.java:65)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:54)
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at com.google.inject.Scopes$1$1.get(Scopes.java:65)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:54)
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at com.google.inject.Scopes$1$1.get(Scopes.java:65)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:54)
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
at com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:978)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024)
at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:974)
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
at com.project1.server.servlets.HomeServlet.<init>(HomeServlet.java:43)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at org.eclipse.jetty.server.handler.ContextHandler$Context.createInstance(ContextHandler.java:2481)
at org.eclipse.jetty.servlet.ServletContextHandler$Context.createServlet(ServletContextHandler.java:1327)

pom.xml

<dependency>
    <groupId>javax.jdo</groupId>
    <artifactId>jdo2-api</artifactId>
    <version>2.3-eb</version>
</dependency>
<dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-core</artifactId>
    <version>1.1.4</version>
    <scope>runtime</scope>
</dependency>

    <dependency>
        <groupId>com.google.appengine.orm</groupId>
        <artifactId>datanucleus-appengine</artifactId>
        <version>1.0.10</version>
    </dependency>

    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-enhancer</artifactId>
        <version>1.1.4</version>
    </dependency>

  </dependencies>

  <build>
  <plugins>


  <plugin>
    <groupId>org.datanucleus</groupId>
                <artifactId>datanucleus-maven-plugin</artifactId>
                <version>1.1.4</version>
                <configuration>
                    <api>JDO</api>
                    <props>${basedir}/datanucleus.properties</props>
                    <log4jConfiguration>${basedir}/log4j.properties</log4jConfiguration>
                    <verbose>true</verbose>
                    <source>1.8</source>
          <target>1.8</target>
                    <requireJavaVersion>
               <version>1.8</version>
        </requireJavaVersion>
                </configuration>
                <executions>
                    <execution>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>enhance</goal>
                        </goals>
                    </execution>
                </executions>
</plugin> 

【问题讨论】:

  • 也许您使用的 java 8 比您使用的增强器支持的 Java 版本晚?这就是“stackmap frame”通常的意思,因为它是在 Java 的更高版本中引入的。将增强器等更新到 datanucleus v3.1+。但后来 google-appengine 使用了完全古老的数据核,而且无论如何都不是真正的数据核
  • 显然他们的文档告诉你如何使用 DataNucleus v3.x(不支持,也很古老)cloud.google.com/appengine/docs/standard/java/datastore/jdo/…
  • 感谢您的所有帮助..我能够找到 jars 的工作集...

标签: java maven google-app-engine datanucleus


【解决方案1】:

对于 Google App Engine+Java 1.7 或 1.8+JDO2+Maven 构建项目,适用于我的 datanucleus 类增强的 jar 集是:

asm-5.0.4.jar
datanucleus-core-1.1.5.jar
datanucleus-enhancer-1.1.4.jar
datanucleus-jpa-1.1.5.jar
datanucleus-appengine-1.0.10.jar
jdo2-api-2.3-eb.jar
appengine-api-1.0-sdk-1.9.60.jar

我通过命令行手动增强类。 http://www.datanucleus.org/products/accessplatform/jdo/enhancer.html#manual

java -cp target/classes/:lib/*  org.datanucleus.enhancer.DataNucleusEnhancer  target/classes/com/project1/server/Entity/*.class

其中 lib 是包含上述 jar 的文件夹。

【讨论】:

  • 但是您仍在使用 datanucleus-enhancer v1.1 并且它也不处理堆栈图帧。所以不,这不是一个“答案”
猜你喜欢
  • 1970-01-01
  • 2015-02-18
  • 2019-08-04
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
相关资源
最近更新 更多