9
votes

Maven: Comment passer des paramètres entre Mojos?

Comment programmer un Mojo pour définir la configuration d'une autre Mojo? Par exemple: Mojo A nécessite un paramètre de configuration a.foo à définir. Un utilisateur peut spécifier a.foo manuellement ou exécuter plugin B qui calculera la valeur pour lui / elle.


0 commentaires

3 Réponses :


2
votes

Je suppose que la méthode Maven serait de définir une propriété dans le premier Mojo et d'y accéder de l'autre Mojo.


1 commentaires

Les tests montrent que cela ne fonctionne pas. Les substituts de propriété comme celle-ci sont résolus dans leurs valeurs littérales avant l'exécution des plugins (je pense qu'il est au moment de la création du POM effectif). Qu'est-ce que le travail est si le plugin que vous essayez de communiquer avec une "expression" définie pour son paramètre, car une évaluation de celles-ci est retardée davantage .. Mais pour quelque chose que vous avez mis dans votre POM dans la section de configuration d'une POM, modification en cours d'exécution Un autre plugin est trop tard.



6
votes

Répondre à ma propre question:

Il est possible d'accéder à des propriétés de configuration ou de projet d'un plugin au moment de l'exécution à l'aide d'un MavenProject code> instance: p>

private Plugin lookupPlugin(String key)
{
    List plugins = getProject().getBuildPlugins();

    for (Iterator iterator = plugins.iterator(); iterator.hasNext();)
    {
        Plugin plugin = (Plugin) iterator.next();
        if(key.equalsIgnoreCase(plugin.getKey()))
            return plugin;
    }
    return null;
}

...
Xpp3Dom configuration = (Xpp3Dom) Plugin.getConfiguration()
configuration.getChild("parameterName"); // get parameter
configuration.addChild(new Xpp3Dom("parameterName")); // add parameter
...


4 commentaires

Bien que ce soit le moyen le plus puissant (+1), je suggérerais la voie mavenaire standard comme suggérée par Pascal (aussi +1).


Voir de NEDRUOD répondez si vous rencontrez des problèmes avec cette solution.


Salut peut-il vraiment être utilisé pour réussir les choses entre Mojos? J'ai essayé cette solution en modifiant la configuration du Mojo cible de mon Mojo. Il ne peut jamais obtenir la configuration supplémentaire lorsqu'elle exécute (dans la même phase).


@Rezakasyauqi, cela a fonctionné pour moi dans le passé. Au-delà, je ne sais pas. Si cela fonctionne pour vous si les Mojos sont en phases différentes, cela ressemble vraiment à une limitation. Essayez de produire un bug contre Maven ou en utilisant La réponse de Pascal .



2
votes

Cela s'avère être une chose délicate à faire principalement due à la synchronisation de la "configuration" des plugins par le Maven Runtime. Changer la "configuration" de getbuildplugins ne va généralement pas fonctionner.

La meilleure méthode est la valeur par défaut si vous écrivez le plug-in cible, utilisez sinon des propriétés.

avec des propriétés, mais vous devez Faites attention à la façon dont vous utilisez les propriétés. La prudence consiste à se rendre compte que si votre POM (ou tout parent) définit une valeur pour une propriété, la référence $ {propriété} sera remplacée lorsque le POM est chargé. Toutefois, s'il n'y a pas de propriété "propriété", la référence $ {propriété} est remplacée et n'est remplacée qu'avec une valeur null au dernier moment possible.

"valeur par défaut" est également évalué au dernier possible. moment, et je pense que c'est une solution plus sûre car il y a une raison logique pour laquelle il doit être évalué au dernier moment éventuel, où, à mesure que la propriété inexistante peut simplement être un détail de mise en œuvre pouvant changer dans les futures versions de Maven.

Dans mon cas, je devais recourir à des propriétés parce que je voulais contrôler la "Directory Classes" du plug-in Surefire. Je voulais qu'il continue à rester par défaut à $ {project.build.outputdirectory} lorsque COBERTURA n'était pas exécuté, mais lorsque COBERTURA a été exécuté, je voulais qu'il utilise $ {project.build.outputdirectory} / classes générées / coobertura.

Définissez dans votre section de plug-ins: xxx

puis dans le plug-in "source": xxx

et faire Bien sûr, en aucune circonstance n'a jamais rien mis comme ce qui suit dans n'importe quel POM: xxx

car si vous le faites, même si la valeur de la propriété est définie par votre plugin source, votre destination Le plugin ne verra pas la valeur. Vous pouvez ignorer cette dernière mise en garde si votre utilisation d'une propriété est passée dans la valeur par défaut du plugin source, mais comme indiqué dans mon cas ne fonctionnerait pas parce que je ne voulais pas modifier la valeur du projet.build.outputdirectory.


0 commentaires