2016-11-07 28 views
0

我想執行的搖籃工具API在Groovy第二個參數,但我無法調用addProgressListner()方法,因爲我在編譯過程中遇到了奇怪的問題:傳遞可變參數在搖籃工具API

buildscript { 
    repositories { 
     maven { url 'https://repo.gradle.org/gradle/libs-releases' } 
    } 

    dependencies { 
     classpath "org.gradle:gradle-tooling-api:3.1" 
     classpath 'org.slf4j:slf4j-simple:1.7.10' 
    } 
} 

ext { 
    GRADLE_PROJECT_HOME = '...' 
} 


import org.gradle.tooling.* 
import org.gradle.tooling.events.OperationType 

task testGradleToolingAPI { 
    doLast { 
     ProjectConnection projectConnection = GradleConnector.newConnector() 
                  .forProjectDirectory(GRADLE_PROJECT_HOME as File) 
                  .connect() 

     def operationTypes = [OperationType.TASK] as OperationType[] 
     println "operationTypes.class: ${operationTypes.class}" 

     projectConnection.newBuild() 
         .addProgressListener(new ApolloBuildProgressListener(), operationTypes) 
         .run() 

     finally { 
      projectConnection.close() 
     } 
    } 
} 

class ApolloBuildProgressListener implements ProgressListener { 
    @Override 
    void statusChanged(ProgressEvent event) { 
     println "Progress event: ${event.description}" 
    } 
} 

operationTypes.class: class [Lorg.gradle.tooling.events.OperationType; 
:testGradleToolingAPI FAILED 

FAILURE: Build failed with an exception. 

* Where: 
Build file '/home/martin/devel/tmp/gradle-tooling-api/build.gradle' line: 36 

* What went wrong: 
Execution failed for task ':testGradleToolingAPI'. 
> No signature of method: org.gradle.tooling.internal.consumer.DefaultBuildLauncher.addProgressListener() is applicable for argument types: (ApolloBuildProgressListener, [Lorg.gradle.tooling.events.OperationType;) values: [[email protected], [TASK]] 
    Possible solutions: addProgressListener(org.gradle.tooling.events.ProgressListener, [Lorg.gradle.tooling.events.OperationType;), addProgressListener(org.gradle.tooling.ProgressListener), addProgressListener(org.gradle.tooling.events.ProgressListener), addProgressListener(org.gradle.tooling.events.ProgressListener, java.util.Set) 

我缺少的是:作爲可變參數不正確識別編譯失敗?

回答

1

我猜ApolloBuildProgressListener正在實施org.gradle.tooling.ProgressListener時它應該是org.gradle.tooling.events.ProgressListener。試試這個:

class ApolloBuildProgressListener implements org.gradle.tooling.events.ProgressListener { 
    ... 
} 

請注意,BuildLauncher有四個addProgressListener(...)方法。一個接受org.gradle.tooling.ProgressListener,另外3個接受org.gradle.tooling.events.ProgressListener

+0

OMG,是的,你是對的。我完全錯過了這一點。謝謝。 – Crazyjavahacking