Gradle - 在插件应用期间抛出错误 - “无法通知ProjectEvaluationListener.afterEvaluate()”

时间:2014-11-21 19:31:04

标签: error-handling gradle

我希望在插件应用方法期间抛出错误,以便通知用户缺少设置(并帮助他们修复它)。我反复看到以下错误:

Failed to notify ProjectEvaluationListener.afterEvaluate(), but primary configuration failure takes precedence.

我希望做两件事:

  1. 以正确的方式通知afterEvaluate()
  2. 避免产生巨大的堆栈跟踪 - 只需要异常消息
  3. Gradle bug 1617中的最后一条评论说明如下:

    >即使apply()引发异常,也会执行afterEvaluate闭包 这并不奇怪。你给afterEvaluate()的闭包是一个回调,即使评估失败也会触发。 您应该在afterEvaluate回调中检查项目的状态(http://www.gradle.org/docs/current/javadoc/org/gradle/api/Project.html#getState()),如果它处于失败状态则返回。

    经过多次测试后,我无法找到构造调用getState()的正确方法。

    gradle插件文件摘要:

    class j2objc implements Plugin<Project> {
    
        void apply(Project project) {
    
            project.afterEvaluate {
                // Setup basic paths
                def j2objcHome = System.getenv()['J2OBJC_HOME']
                if (j2objcHome == null) {
                    throw new InvalidUserDataException(
                            'j2objc home not set, <helpful instructions to fix>')
                }
    
                project.tasks.create(name: 'j2objcTranslate', type: Exec) {
                    // Should not be called if there's a failure
                    description 'Translates all the java source files in to Objective-C using j2objc'
                    // <implementation>
                }
            }
        }
    }
    

    完整错误,包括我要隐藏的长堆栈跟踪的一部分:

    $ gradlew base:j2objcTranslate
    Failed to notify ProjectEvaluationListener.afterEvaluate(), but primary configuration failure takes precedence.
    org.gradle.api.InvalidUserDataException: j2objc home not set, this can be set using J2OBJC_HOME environment variable or within build.gradle by adding: j2objcConfig { j2objcHome = <path> }, e.g. j2objcConfig { j2objcHome = "$projectDir/../j2objc/"}
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    <a huge number more lines>
    

    更新

    父gradle文件中有错误。当它被修复时,它产生了更好的输出(复制如下)。即便如此,如前所述,当出现多个故障时,最好生成更好的错误消息。

    $ gradlew base:j2objcTranslate
    
    FAILURE: Build failed with an exception.
    
    * Where:
    Script '/Users/brunobowden/dev/myproject/base/j2objc.gradle' line: 35
    
    * What went wrong:
    A problem occurred configuring project ':android'.
    > A problem occurred configuring project ':base'.
        > j2objc home not set, <helpful message>
    

1 个答案:

答案 0 :(得分:0)

我的情况是,在添加ANDROID_PATH之后,它起作用了。