2017-09-13 78 views
0

我已經在Java中實現了一個Gradle插件。我跟着this tutorial只設置依賴於Gradle插件任務

我的插件類,如下所示:

public class DemoPlugin implements Plugin<Project> { 
    @Override 
    public void apply(Project project) { 
     project.getExtensions().create("DemoSetting", DemoPluginExtension.class); 

     project.getTasks().create("demo", DemoTask.class); 
    } 
} 

目前,我打算實施的onlyIf功能,但遺憾的是我沒有成功呢。

我嘗試如下:

public class DemoPlugin implements Plugin<Project> { 
    @Override 
    public void apply(Project project) { 
     DemoPluginExtension ext = project.getExtensions().create("demoSetting", DemoPluginExtension.class); 

     Closure closure = new Closure(this) { 
      public Object doCall() { 
       return ext.isExecuteTask(); 
      } 
     }; 

     project.getTasks().create("demoProperties", demoTask.class).onlyIf(closure); 
    } 
} 

我觀察的錯誤是:

出了什麼問題: 執行失敗的任務 ':演示'。 任務開始執行後,無法在任務'demo'上調用Task.setOnlyIf(Closure)。

我真的很感激,如果有人能給我一個提示,以解決這個問題。

+0

您能否提供一個完整的可編輯示例? – Opal

+1

閉包是Groovy的概念。即使Java爲處理閉包提供支持,我也會建議在Gradle API中使用Java等價物,本例中爲'onlyIf(Spec <?extends Task>)'方法。 –

+0

最後,我通過實現public Object call(Object arguments)方法而不是public Object doCall()來解決它。 – pafede2

回答

0

最後我解決它使用下面的代碼:

public class DemoPlugin implements Plugin<Project> { 
    @Override 
    public void apply(Project project) { 
     DemoPluginExtension ext = project.getExtensions().create("demoSetting", DemoPluginExtension.class); 

     project.getTasks().create("demoProperties", demoTask.class).onlyIf(new Closure(this) { 
      public Object call(Object arguments) { 
       return true; 
      } 
     }); 
    } 
} 

請注意方法

公共對象調用(對象參數)的執行

,而不是

public object doCall()

相關問題