【问题标题】:Datanucleus using wrong enhancer in Google App Engine 1.7Datanucleus 在 Google App Engine 1.7 中使用错误的增强器
【发布时间】:2012-07-01 22:10:27
【问题描述】:

在使用 Datanucleus 插件在 Eclipse 中增强 GAE 1.7.0 上的类时,我很难让 Datanucleus 2 正常工作。当我按照此处的手动步骤操作时,这在旧版本的 GAE 中运行良好:

http://www.datanucleus.org/products/accessplatform/guides/eclipse/index.html

但自从升级以来,GAE 现在包含了这些库(看起来像是它们的较新版本),而且 GAE 有一个新的“增强器”标志,您可以设置。我无论如何都找不到在 Eclipse 中设置这个标志。当我想要 V2 库和 Datanucleus 根据此错误发生冲突时,GAE 似乎仍然包含 v1 库:

Jul 1, 2012 5:59:55 PM org.datanucleus.enhancer.DataNucleusEnhancer <init>
INFO: DataNucleus Enhancer : Using ClassEnhancer "ASM" for API "JPA"
Exception in thread "main" java.lang.NoSuchFieldError: NUCLEUS_CONTEXT_LOADER
    at org.datanucleus.NucleusContext.<clinit>(NucleusContext.java:73)
    at org.datanucleus.enhancer.DataNucleusEnhancer.<init>(DataNucleusEnhancer.java:171)
    at org.datanucleus.enhancer.DataNucleusEnhancer.main(DataNucleusEnhancer.java:1265)

我尝试了很多不同的方法。我已经尝试使用所有默认值。我尝试将 v2 库添加到 Datanucleus 运行时类路径条目。我已经尝试在 src 和 libs 中删除 GAE 1.7.0 SDK 中的 v1 库。但不知何故,GAE 仍在停止(或试图停止 V1 库。我什至尝试过按照上面链接指定的手动设置配置的旧方法。这有点令人沮丧,因为我现在好像在我根本无法使用这些库的情况下。至少对于旧版本的 GAE,我可以手动将其设置为工作。现在似乎没有任何工作。有什么建议吗?

【问题讨论】:

  • 什么“DataNucleus 2”? DataNucleus 当前版本为 3.0 和 3.1。 Google 插件版本为 v 2.0.1.1(使用 DataNucleus v3.0.x)
  • 啊,对。是的,包含的 DataNucleus 版本是 v3.0.x。我能够通过手动从 GAE 1.7.0 版中的 src 和 lib 中删除 v1 库来使其工作,以便 GAE 停止尝试将它们放入 WEB-INF/lib 中。我在类路径上与 v3 和 v1 DataNucleus 库发生冲突。 GAE 声明您可以添加一个增强器标志来告诉它要使用哪些版本,但我看不到如何在 Eclipse 中使用该标志来阻止它复制这些库。所以解决方法似乎对我有用。这并不理想,但它会起作用。
  • @DataNucleus 当我浏览 appengine 1.7 文件夹时,Datanucleus jar 是 datanucleus-core-1.1.5.jar、datanucleus-jpa-1.1.5 等。Google 插件使用是什么意思Datanucleus v3.0.x?
  • @DataNucleus 嗯,有v2文件夹,但是如何强制谷歌插件使用v2?
  • 好的,无需破解 GAE 版本即可正常工作。我在 com.google.appengine.eclipse.core.prefs 文件中的 .settings 文件夹中找到了 eclipse 的标志,并将此标志更改为使用 v2。 gaeDatanucleusVersion=v2 然后在启动eclipse之后。在 JPA 下的 window-preferences-DataNucleus 下,我从 appengine-java-sdk-1.7.x/lib/opt/tools/datanucleus/v2 添加了 asm-3.x.x.jar 和 datanucleus-enhancer-3.x.x.jar。现在它正在使用正确的增强器并为该版本找到正确的增强器类。

标签: google-app-engine jpa-2.0 datanucleus


【解决方案1】:

我遇到了同样的错误,并且能够通过以下方式在我的项目中解决它:

  • 按照 DavidB 在 cmets 中的建议执行操作,而无需修改首选项中的 DataNucleus JPA 设置。
  • 从 war/WEB-INF/lib 中删除所有“V1”jar

要阐明 DavidB 的建议,请打开包含您的项目的目录。将有一个名为“.settings”的文件夹,打开它并编辑 com.google.appengine.eclipse.core.prefs。只需将第三行从 gaeDatanucleusVersion=v1 更改为 gaeDatanucleusVersion=v2

完成此操作后,从您的 war/WEB-INF/lib 目录中删除以下 jar:

  • datanucleus-appengine-1.0.10.final.jar
  • datanucleus-core-1.1.5.jar
  • datanucleus-jpa-1.1.5.jar
  • geronimo-jpa_3.0_spec-1.1.1.jar
  • geronimo-jta_1.1_spec-1.1.1.jar
  • jdo2-api-2.3-eb.jar

重新启动 Eclipse,你应该一切顺利。

【讨论】:

  • 还要检查构建路径库。就我而言,有两个 App Engine SDK 库...一个带有 v1,另一个带有 v2。
  • 我在 GAE 1.7.2 中偶然发现了同样的问题,我不得不删除 'filesCopiedToWebInfLib' 行..... filesCopiedToWebInfLib=appengine-api-labs.jar|appengine-endpoints.jar |appengine-jsr107cache-1.7.2.1.jar|jsr107cache-1.1.jar|appengine-api-1.0-sdk-1.7.2.1.jar|datanucleus-appengine-1.0.10.final.jar|datanucleus-core-1.1.5 .jar|datanucleus-jpa-1.1.5.jar|geronimo-jpa_3.0_spec-1.1.1.jar|geronimo-jta_1.1_spec-1.1.1.jar|jdo2-api-2.3-eb.jar
  • 我遇到了一个问题,即 eclipse 突然开始在 v1.1 下寻找 geronimo-jpa_3.0_spec-1.1.1.jar。删除GAE SDK插件文件夹下的v1解决了它。
猜你喜欢
  • 2012-05-26
  • 2015-01-02
  • 2013-11-10
  • 2011-04-25
  • 2013-01-11
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多