2017-09-13 1 views
0

J'ai implémenté un plugin Gradle en Java. J'ai suivi this tutorial.Set onlyDépend de la tâche du plugin Gradle

Ma classe de plug-in se présente comme suit:

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

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

Actuellement, je suis destiné à mettre en œuvre la fonction onlyIf mais malheureusement, je ne l'ai pas encore réussi.

Mon essai est la suivante:

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); 
    } 
} 

L'erreur que je suis observais est la suivante:

Qu'est-ce qui a mal tourné: Échec de l'exécution de la tâche ': demo'. Impossible d'appeler Task.setOnlyIf (fermeture) sur la tâche ': demo' après l'exécution de la tâche.

Je serais vraiment reconnaissant si quelqu'un pourrait me donner un indice pour résoudre le problème.

+0

Pourriez-vous s'il vous plaît fournir un exemple complet et compilable? – Opal

+1

Les fermetures sont un concept Groovy. Même si Java prend en charge la gestion des fermetures, je suggère d'utiliser les équivalents Java dans l'API Gradle, dans ce cas la méthode 'onlyIf (Spec )'. –

+0

Enfin, je l'ai résolu en implémentant la méthode public Object call (Object arguments) au lieu de public Object doCall(). – pafede2

Répondre

0

Enfin je l'ai résolu en utilisant le code suivant:

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; 
      } 
     }); 
    } 
} 

S'il vous plaît noter la mise en œuvre de la méthode

publique d'appel d'objet (arguments Object)

au lieu de

public Object doCall()