我正在尝试构建我的第一个googleappenginewar,并正在建立我自己的外部(eclipse之外)ant构建,以便从终端执行。我正试图让<enhance_war/>
ant宏工作,并遇到一个奇怪的NoSuchMethodError
。
这是我的蚂蚁目标:
<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>
所以在执行这个
<enhance />
任务时出现了一些问题,但是我不知道是什么。最后是
/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
中定义的,我在构建类路径中绝对有这个定义。加上它的aNoSuchMethodError
,所以它让我觉得我有一个jar地狱/版本控制的问题。有什么想法吗? 最佳答案
您的类路径中有一个不同版本的datanucleus core,以满足增强器的要求。验证增强器正在使用什么并修复它。符合性要求见http://code.google.com/p/datanucleus-appengine/wiki/Compatibility。
最新的gae-sdk提供了“gae-jdo-plugin”v2.1.1iirc,这是最新的版本(尽管还有更新的尚未发布的fwiw),它出现在lib/opt/blahblahblah下。这利用了DataNucleusV3.1.x。这是建议人们运行的对象。gae jdo插件在http://code.google.com/p/datanucleus-appengine/
关于java - Google App Engine JDO增强失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14554774/