【问题标题】:gradlew :appengineEnhance failsgradlew :appengineEnhance 失败
【发布时间】:2014-04-29 21:06:06
【问题描述】:

我正在使用Google App EngineAndroid Studio 在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% > :[module name]: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

我可以从 Google 找到的所有文档都使用 Eclipsemavenant,但 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.

所以我做到了。这是日志文件:

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

有趣的是

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."

所以看起来datanucleus-enhancer 存在两个截然不同的版本。不知何故,gradlew 下载了版本3.1.1(我在build.gradle 中指定了),而部分过程想要使用版本1.1.4。同样,我找不到任何关于如何更改它的资源,因为网络上的每个教程都使用 Maven。

【问题讨论】:

  • CLASSPATH 是?它定义了可以加载的内容,而AppEngine通常在WEB-INF或其他地方有一些jar。
  • 我怎么知道 CLASSPATH 是什么?
  • 它告诉你它包含了“file:/C:/Users//.gradle/appengine-sdk/appengine-java-sdk-1.9.3/lib/opt/tools /datanucleus/v1/datanucleus-enhancer-1.1.4.jar" 所以删除它也许......和任何其他datanucleus-*-1.1 jars
  • 我试过了,但是每次我构建时它们都会以某种方式被 gradle 下载,就像他们应该的那样。我想问题是某些东西认为我想使用增强器的1.1.4 版本,即使我想使用 3.1.1。

标签: java google-app-engine gradle datanucleus


【解决方案1】:

更新:

这个答案有点过时了,如果你使用 gradle-appengine-plugin 1.9.5 或更高版本,你应该使用新配置

appengine {
  enhancer {
    version = "v2"
    enhanceOnBuild = true
  }
}

而不是下面的内容。

原答案:

您可能需要配置增强器以使用增强器的 v2。

在您的 build.gradle 文件中

appengine {
  enhancerVersion = "v2"
}

[编辑] 在创建战争之前让增强自动运行

在您的 build.gradle 文件中

war.dependsOn appengineEnhance

【讨论】:

  • 这使:appengineEnhance 成功,但:appengineRun 仍然给我同样的错误。
  • 因此 appengineEnhance 仅在打包前增强中间“build/classes”目录中的类。我认为您可能需要执行“./gradlew appengineEnhance appengineAssemble”,甚至通过将 [war.depends on appengineEnhance] 添加到您的构建文件来将增强任务添加为依赖项
  • 我添加了依赖;现在我又收到一条错误消息:com.google.api.server.spi.config.validation.MissingParameterNameException: myApi.com.mthoresen.fest.backend.MyEndpoint.MyEndpoint.jdoProvideField parameter (type int): Missing parameter name. Parameter type (int) is not an entity type and thus should be annotated with @Named.,我猜这是增强器创建的一种方法。
  • 因此它可能不应该增强您的端点类。您在 MyEndpoint 类上有哪些注释?
  • 哇。类MyEndpoint 被错误地注释为@PersistenceCapable。我删除了注释,现在它可以工作了。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我遇到了同样的问题 ("org.datanucleus.enhancer" is already registered),我找到了解决方案。

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

    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 任务并且服务已启动并正常工作!

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-12
        • 2021-12-13
        • 2016-08-01
        • 2019-06-28
        • 2020-07-14
        • 1970-01-01
        • 2019-06-19
        相关资源
        最近更新 更多