【问题标题】:Google App Engine JDO enhancement is failingGoogle App Engine JDO 增强失败
【发布时间】:2013-01-11 08:42:35
【问题描述】:

我正在尝试构建我的第一个 Google App Engine WAR,并正在设置我自己的外部(Eclipse 之外)Ant 构建以从终端执行。我试图让<enhance_war/> Ant 宏工作,但遇到了一个奇怪的NoSuchMethodError

这是我的 Ant 目标:

<target name="package" depends="gendocs">
    <echo message="Enhancing WAR JDO classes." />
    <enhance_war war="war" />

    <echo message="Packaging the WAR file." />
    <war destfile="gen/dist/myapp.war" webxml="war/web.xml">
        <fileset dir="war">
            <includes name="**/*.xml" />
        </fileset>
        <lib dir="war/WEB-INF/lib" />
        <classes dir="war/WEB-INF/classes" />
    </war>
</target>

这是 Ant 尝试执行 package 目标时的输出:

package:
     [echo] Enhancing WAR JDO classes.
  [enhance] Encountered a problem: Unexpected exception
  [enhance] Please see the logs [/tmp/enhance4426322586552955387.log] for further information.

BUILD FAILED
/home/myuser/sandbox/workbench/eclipse/workspace/myapp/build/build-local.xml:193: The following error occurred while executing this line:
/home/myuser/sandbox/workbench/google/gae-sdk/1.7.1/appengine-java-sdk-1.7.1/config/user/ant-macros.xml:95: Java returned: 1

那个ant-macros.xml:95对应下面一行:

<enhance failonerror="true" api="@{api}">
    <!-- Rest of the enhance task def -->
</enhance>

所以在执行这个&lt;enhance /&gt; 任务时出了点问题,但我不知道是什么。

最后是/tmp/enhance4426322586552955387.log的日志文件:

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:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.appengine.tools.enhancer.Enhancer.execute(Enhancer.java:74)
    ... 2 more
Caused by: java.lang.NoSuchMethodError: org.datanucleus.plugin.PluginManager.<init>(Lorg/datanucleus/PersistenceConfiguration;Lorg/datanucleus/ClassLoaderResolver;)V
    at org.datanucleus.OMFContext.<init>(OMFContext.java:159)
    at org.datanucleus.enhancer.DataNucleusEnhancer.<init>(DataNucleusEnhancer.java:172)
    at org.datanucleus.enhancer.DataNucleusEnhancer.<init>(DataNucleusEnhancer.java:150)
    at org.datanucleus.enhancer.DataNucleusEnhancer.main(DataNucleusEnhancer.java:1157)
    ... 7 more

这里发生了什么?我不认为这是一个类路径问题,因为org.datanucleus.plugin.PluginManager 类是在datanucleus-core-1.1.5.jar 内部定义的,我在构建类路径中绝对有它。加上它的NoSuchMethodError,所以它让我觉得我有一个 JAR 地狱/版本控制问题。有什么想法吗?

【问题讨论】:

  • 如果增强器进程说该方法不存在(在其 CLASSPATH 中),那么它不存在。所以你有一些其他版本的 datanucleus-core 与增强器一起出现。显然,那里使用的是旧的不受支持的 DataNucleus 版本,因此建议使用最近的东西(使用最近的 GAE JDO 插件)
  • 感谢@DataNucleus (+1) - 我在lib/opt/user/v2/datanucleus 下看到另一个版本的DataNucleus ...它的版本是3.1.0-m3。这可能是你说的最近的插件吗?

标签: java google-app-engine ant jdo datanucleus


【解决方案1】:

您的类路径中的 datanucleus-core 版本与增强器所需的版本不同。验证增强器正在使用什么并修复它。有关兼容性要求,请参阅 http://code.google.com/p/datanucleus-appengine/wiki/Compatibility

最新的 GAE SDK 提供了“GAE JDO 插件”v2.1.1 IIRC,这是最新的版本(尽管有更近的尚未发布的 fwiw),它存在于 lib/opt/blahblahblah 下。这利用了 DataNucleus v3.1.x。这是人们被推荐反对的。 GAE JDO 插件开发于http://code.google.com/p/datanucleus-appengine/

【讨论】:

  • 再次感谢@DataNucleus (+1) - 我认为您的声明“验证增强器正在使用什么并修复它”是我问题的根源。我找到了EnhancerTaskant-macros.xml 在后台用于&lt;enhance_war/&gt; 任务)并查看了它的源代码,但它并没有帮助我验证它正在寻找什么 JDO/DataNucleus 类或版本.您将如何在此处验证 JAR 依赖项?一旦我找到 &lt;enhance_war/&gt; 正在运行的确切 JAR,我可以更改它们,或调整 ant-macros.xml 文件以指向正确的 JAR/版本。再次感谢!
  • DN 增强器 EnhancerTask 接受一个类路径 arg,根据 datanucleus.org/products/accessplatform_3_1/enhancer.html#ant 所以在某个地方设置了。
  • ant-macros.xml文件配置的Ant&lt;classpath&gt;arg由两个pathelements和一个fileset组成;统称为:war/WEB-INF/libwar/WEB-INF/classes${GAE_SDK_HOME}/lib/appengine-tools-api.jar 设置为此 classpath arg。 war/WEB-INF/lib 内部是所有 datanucleus JAR 的正确版本 (3.1.0)。我想当我使用 Google-Eclipse 插件创建一个新的 Web 应用程序项目时,这些是自动为我放置的。
  • 所以我想我在增强器任务正在使用的类路径上确实有正确的 JAR。作为我的 Ant 构建的一部分,我将旧的 datanucleus JAR(出于无知)拉入 MyApp/lib/main,然后将它们添加到 build.classpath Ant PATH。但是这个 build.classpath 应该与增强任务正在使用的类路径 arg 无关,所以我仍然不知道我是如何得到原始错误的......
  • 您的错误是使用需要 DN 1.1 的旧版 GAE JDO 插件 (v1.x),并且它在增强器类路径中有 DN3.x,因此出现异常。如果您现在使用的是 GAE JDO 插件 v2.x,那么您需要在增强器的类路径中使用 DN3.x。取决于您现在使用的 GAE 插件
猜你喜欢
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2011-04-25
  • 2010-12-11
  • 2011-12-28
  • 2011-06-19
  • 1970-01-01
  • 2012-08-17
相关资源
最近更新 更多