Java 格雷德卢:外观工程失败了

Java 格雷德卢:外观工程失败了,java,google-app-engine,gradle,datanucleus,Java,Google App Engine,Gradle,Datanucleus,我正在使用googleappengine和androidstudio用Java创建一个移动后端。为了启动本地服务器公开我的API,我使用了gradlew[module name]:appengineRun 但是,当我转到http://localhost:8080/_ah/api/explorer,并尝试使用API 我得到以下错误: apr 29, 2014 10:52:32 PM com.google.api.server.spi.SystemService invokeServiceMetho

我正在使用
googleappengine
androidstudio
用Java创建一个移动后端。为了启动本地服务器公开我的API,我使用了
gradlew[module name]:appengineRun

但是,当我转到
http://localhost:8080/_ah/api/explorer
,并尝试使用API 我得到以下错误:

apr 29, 2014 10:52:32 PM com.google.api.server.spi.SystemService invokeServiceMethod
SEVERE: The class "com.mthoresen.fest.backend.LocationBean" is not persistable. 
This means that it either hasnt been enhanced, or that the enhanced version of 
the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the 
Meta-Data/annotations for the class are not found.
此外,这个过程永远不会结束——它停留在
Building 88%>:[模块名称]:appengineRun


编辑 loosebazooka的回答解决了这个问题,但是
appengineRun
仍然以同样的错误失败。

因此,我尝试了
gradlew[module name]:appengineEnhance
,结果如下:

Relying on packaging to define the extension of the main artifact has been deprecated and is scheduled to be removed in Gradle 2.0
:backend:appengineDownloadSdk                                                        
:backend:compileJava UP-TO-DATE                                                  
:backend:appengineEnhance FAILED          

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':backend:appengineEnhance'.
> An error occurred enhancing DataNucleus classes.

* Try:         
Run with --stacktrace option to get the stack trace. Run with --info or --debug option  to get more log output.

BUILD FAILED   
--info
没有提供任何其他信息,而
--debug
是获得大量输出的有效途径<代码>--stacktrace也没有真正的帮助:

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task     ':backend:appengineEnhance'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:289)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:86)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
    at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:67)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:54)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:166)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:113)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:81)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:64)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
    at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:50)
    at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:171)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:201)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:174)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:170)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:139)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
    at org.gradle.launcher.Main.doAction(Main.java:46)
    at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
    at org.gradle.launcher.Main.main(Main.java:37)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:50)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:32)
    at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
    at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:33)
    at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:130)
    at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)
Caused by: org.gradle.api.GradleException: An error occurred enhancing DataNucleus classes.
    at com.google.appengine.task.EnhanceTask.enhanceClasses(EnhanceTask.groovy:58)
    at com.google.appengine.task.EnhanceTask.executeTask(EnhanceTask.groovy:34)
    at com.google.appengine.task.AbstractTask.start(AbstractTask.groovy:38)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:219)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:212)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:201)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:533)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:516)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
    ... 46 more
Caused by: : Java returned: 1
    at org.apache.tools.ant.taskdefs.Java.execute(Java.java:111)
    at com.google.appengine.tools.enhancer.EnhancerTask.execute(EnhancerTask.java:97)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.gradle.api.internal.project.ant.BasicAntBuilder.nodeCompleted(BasicAntBuilder.java:71)
    at org.gradle.api.internal.project.ant.BasicAntBuilder.doInvokeMethod(BasicAntBuilder.java:86)
    at org.gradle.api.internal.project.DefaultAntBuilder.super$3$invokeMethod(DefaultAntBuilder.groovy)
    at org.gradle.api.internal.project.DefaultAntBuilder.invokeMethod(DefaultAntBuilder.groovy:37)
    at com.google.appengine.task.EnhanceTask.enhanceClasses(EnhanceTask.groovy:42)
    ... 56 more
我能从谷歌找到的所有文档都使用了
Eclipse
maven
ant
,但是
Android Studio
有一个
Google App Engine
插件,所以说它不受支持是没有意义的

我要保存的java类:

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.Key;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class LocationBean {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;
    @Persistent
    private double lat;
    @Persistent
    private double lng;
    @Persistent
    private double rad;
    @Persistent
    private long endtime;

    /** Getters and setters */
}
--debug
的输出中,我找到了以下行:

Encountered a problem: Unexpected exception
Please see the logs [C:\Users\<username>\AppData\Local\Temp\enhance4980231719213251330.log] for further information.
遇到问题:意外异常
有关更多信息,请参阅日志[C:\Users\\AppData\Local\Temp\enhance4980231719213251330.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(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.appengine.tools.enhancer.Enhancer.execute(Enhancer.java:74)
... 2 more
Caused by: org.datanucleus.exceptions.NucleusException: Plugin (Bundle) "org.datanucleus.enhancer" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/C:/Users/Martin/.gradle/caches/modules-2/files-2.1/org.datanucleus/datanucleus-enhancer/3.1.1/b141c67d55cc19f14639f091b84e692e2198dc50/datanucleus-enhancer-3.1.1.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/C:/Users/Martin/.gradle/appengine-sdk/appengine-java-sdk-1.9.3/lib/opt/tools/datanucleus/v1/datanucleus-enhancer-1.1.4.jar."
at org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:541)
at org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:395)
at org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensions(NonManagedPluginRegistry.java:219)
at org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensionPoints(NonManagedPluginRegistry.java:160)
at org.datanucleus.plugin.PluginManager.<init>(PluginManager.java:65)
at org.datanucleus.plugin.PluginManager.createPluginManager(PluginManager.java:427)
at org.datanucleus.NucleusContext.<init>(NucleusContext.java:224)
at org.datanucleus.NucleusContext.<init>(NucleusContext.java:204)
at org.datanucleus.enhancer.DataNucleusEnhancer.<init>(DataNucleusEnhancer.java:160)
at org.datanucleus.enhancer.DataNucleusEnhancer.main(DataNucleusEnhancer.java:1133)
... 7 more
java.lang.RuntimeException:意外异常
位于com.google.appengine.tools.enhancer.enhancer.execute(enhancer.java:76)
位于com.google.appengine.tools.enhancer.Enhance.(Enhance.java:71)
位于com.google.appengine.tools.enhancer.Enhance.main(Enhance.java:51)
原因:java.lang.reflect.InvocationTargetException
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于com.google.appengine.tools.enhancer.enhancer.execute(enhancer.java:74)
... 还有两个
原因:org.datanucleus.exceptions.NucleusException:Plugin(Bundle)“org.datanucleus.enhancer”已注册。确保类路径中没有同一插件的多个JAR版本。URL“file:/C:/Users/Martin/.gradle/caches/modules-2/files-2.1/org.datanucleus/datanucleus-enhancer/3.1.1/b141c67d55cc19f14639f091b84e692e2198dc50/datanucleus-enhancer-3.1.1.jar”已经注册,您正在尝试注册位于URL的相同插件“文件:/C:/Users/Martin/.gradle/appengine sdk/appengine-java-sdk-1.9.3/lib/opt/tools/datanucleus/v1/datanucleus-enhancer-1.1.4.jar。”
位于org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:541)
位于org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:395)
位于org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensions(NonManagedPluginRegistry.java:219)
位于org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensionPoints(NonManagedPluginRegistry.java:160)
位于org.datanucleus.plugin.PluginManager.(PluginManager.java:65)
位于org.datanucleus.plugin.PluginManager.createPluginManager(PluginManager.java:427)
位于org.datanucleus.NucleusContext(NucleusContext.java:224)
位于org.datanucleus.NucleusContext(NucleusContext.java:204)
位于org.datanucleus.enhancer.DataNucleusEnhancer.(DataNucleusEnhancer.java:160)
位于org.datanucleus.enhancer.DataNucleusEnhancer.main(DataNucleusEnhancer.java:1133)
…还有7个
有趣的是

Plugin (Bundle) "org.datanucleus.enhancer" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL 
"file:/C:/Users/<username>/.gradle/caches/modules-2/files-2.1/org.datanucleus/datanucleus-enhancer/3.1.1/b141c67d55cc19f14639f091b84e692e2198dc50/datanucleus-enhancer-3.1.1.jar" 
is already registered, and you are trying to register an identical plugin located at URL 
"file:/C:/Users/<username>/.gradle/appengine-sdk/appengine-java-sdk-1.9.3/lib/opt/tools/datanucleus/v1/datanucleus-enhancer-1.1.4.jar."
Plugin(Bundle)“org.datanucleus.enhancer”已注册。请确保类路径中没有同一插件的多个JAR版本。URL
“文件:/C:/Users/.gradle/caches/modules-2/files-2.1/org.datanucleus/datanucleus-enhancer/3.1.1/b141c67d55cc19f14639f091b84e692e2198dc50/datanucleus-enhancer-3.1.1.jar”
已注册,并且您正在尝试注册位于URL的相同插件
“文件:/C:/Users/.gradle/appengine sdk/appengine-java-sdk-1.9.3/lib/opt/tools/datanucleus/v1/datanucleus-enhancer-1.1.4.jar。”
因此,看起来有两个大不相同的
datanucleus增强器版本存在。不知怎的,gradlew下载了版本
3.1.1
(我在
build.gradle
中指定了该版本),而过程的一部分希望使用版本
1.1.4
。同样,我找不到任何关于如何更改此版本的资源,因为web上的每个教程都在使用Maven。

更新: 这个答案有点过时了,如果您使用的是gradle appengine插件版本1.9.5或更高版本,您应该使用新的配置

appengine {
  enhancer {
    version = "v2"
    enhanceOnBuild = true
  }
}
而不是下面的内容

原始答复: 您可能需要配置增强器以使用增强器的v2

在build.gradle文件中

appengine {
  enhancerVersion = "v2"
}
war.dependsOn appengineEnhance
[编辑] 使增强在创建战争之前自动运行

在build.gradle文件中

appengine {
  enhancerVersion = "v2"
}
war.dependsOn appengineEnhance
我也遇到了同样的问题(
“org.datanucleus.enhancer”已经注册了),我找到了解决方案

首先,我在我的
build.gradle
PLUS中使用了@loosebazooka发布的代码:

dependencies {
    appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.8'
    compile 'com.google.appengine:appengine-endpoints:1.9.8'
    compile 'com.google.appengine:appengine-endpoints-deps:1.9.8'
    compile 'com.google.appengine.orm:datanucleus-appengine:2.1.2'
    compile 'javax.servlet:servlet-api:2.5'
    compile 'javax.jdo:jdo2-api:2.3-eb'
    compile 'org.datanucleus:datanucleus-api-jdo:3.1.3' // WE NEED THIS
    //compile 'javax.jdo:jdo-api:3.0.1' // ALREADY IN datanucleus-appengine
    //compile 'org.datanucleus:datanucleus-core:3.1.4' // ALREADY IN datanucleus-appengine
    //compile 'org.datanucleus:datanucleus-enhancer:3.1.1' // ALREADY IN datanucleus-appengine
}
我正在运行Android Studio 0.8.10


现在gradle执行了
appengine:appengineEnhance
任务,服务已启动并开始工作!

这不是您问题的解决方案。但可能对其他遇到此异常的人有所帮助:

TaskExecutionException: Execution failed for task     ':backend:appengineEnhance'
Caused by: org.gradle.api.GradleException: An error occurred enhancing DataNucleus classes.
Caused by: : Java returned: 1

如果您声明了一个没有主键的实体类,则可能会发生这种情况。

我也有类似的问题,但我使用的是JPA。我通过指定
api来运行
:appengineEnhance

enhancer {
    version = "v2"
    api="jpa"  // or jdo
    enhanceOnBuild = true
}

类路径是?它定义了可以加载的内容,AppEngine通常在WEB-INF或其他地方有一些JAR。我怎么知道类路径是什么?它告诉你它包含了“文件:/C:/Users//.gradle/AppEngine sdk/AppEngine-java-sdk-1.9.3/lib/opt/tools/datanucl”