【问题标题】:Datanucleus Enhancer Unexpected exceptionDatanucleus Enhancer 意外异常
【发布时间】:2014-03-11 09:01:13
【问题描述】:

我想将 Datanucleus JDO 版本 3.2.8 与 App Engine 一起使用以避免 RDBMS 字符串到 bigint 问题(请参阅 https://stackoverflow.com/questions/21588107/datanucleus-jdo-map-string-to-mysql-type-bigint-in-app-engine

我从这里 http://www.datanucleus.org/products/accessplatform/datastores/appengine.html 下载了 Datanucleus App Engine 插件,并在 [AppEngine SDK]/lib/opt/tools/datanucleus 和 [AppEngine SDK]/lib/opt/user/datanucleus 中创建了一个文件夹“v3”,我把版本 3.2.8 中的插件、datanucleus-core、datanucleus rdbms、jdo api jar 以及 v2 文件夹中的“jdo-api-3.0.1.jar” 我还在项目属性中从 v2 切换到 v3,项目 WEB-INF/lib/ 包含新的 jar。

当我尝试增强 Datanucleus Enhancer 3.2.8 类时。使用以下日志引发意外异常:

java.lang.RuntimeException: Unexpected exception
    at com.google.appengine.tools.enhancer.Enhancer.execute(Enhancer.java:76)
    at com.google.appengine.tools.enhancer.Enhance.<init>(Enhance.java:71)
    at com.google.appengine.tools.enhancer.Enhance.main(Enhance.java:51)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.google.appengine.tools.enhancer.Enhancer.execute(Enhancer.java:74)
    ... 2 more
Caused by: java.lang.NoSuchFieldError: updateLock
    at org.datanucleus.api.jdo.metadata.JDOMetaDataManager.getMetaDataForClassInternal(JDOMetaDataManager.java:440)
    at org.datanucleus.metadata.MetaDataManager.getMetaDataForClass(MetaDataManager.java:1488)
    at org.datanucleus.metadata.MetaDataManager.loadClasses(MetaDataManager.java:545)
    at org.datanucleus.enhancer.DataNucleusEnhancer.getFileMetadataForInput(DataNucleusEnhancer.java:737)
    at org.datanucleus.enhancer.DataNucleusEnhancer.enhance(DataNucleusEnhancer.java:513)
    at org.datanucleus.enhancer.DataNucleusEnhancer.main(DataNucleusEnhancer.java:1281)
    ... 7 more

我缺少什么让它工作?非常感谢您的帮助

【问题讨论】:

  • 使用混合/不一致版本的 jars。 CLASSPATH 中应该没有 3.0/3.1 DN jar,并且所有 3.2 应该是一致的(例如最新的)
  • 我看不到我在哪里使用不同的版本。我现在已将“jdo-api-3.0.1.jar”替换为“jdo-api-3.1-rc1.jar”,但问题仍然存在。我认为 App Engine 插件 3 与实现 jdo 3.1 的 Datanucleus 3.2/3.3 一起使用?
  • org.datanucleus.api.jdo.metadata.JDOMetaDataManager.getMetaDataForClassInternal NoSuchFieldError,因此超类(在 datanucleus-core 中)来自一些较旧的变体。 QED。它在哪里,只有你能看到。
  • 好的,我再次检查了所有内容,由于您的提示,我已将 datanucleus-core 3.2.8 替换为 datanucleus-core 3.2.9,并且我还从构建路径中删除了 App Engine SDK 并再次添加了它,现在一切似乎都在我测试过的情况下工作。谢谢你的帮助
  • 很好,你搞定了。我将添加为答案,以便您接受它

标签: eclipse google-app-engine datanucleus


【解决方案1】:

问题是由于您在 CLASSPATH 中有不一致/不兼容的 DataNucleus jar 版本。该消息表明 MetaDataManager 中不存在“updateLock”字段。因此,您的项目中或此“GAE Eclipse 插件”的配置中的某个地方的 CLASSPATH 中存在一些旧版本的 datanucleus-core.jar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多