Jak zaprogramować jednego Mojo, aby ustawić kolejną konfigurację Mojo? Na przykład: Mojo A wymaga zdefiniowania parametru konfiguracyjnego A.foo
. Użytkownik może ręcznie określić A.foo
lub uruchomić wtyczkę B, która obliczy wartość dla niego/niej.Maven: jak przekazywać parametry między Mojos?
Odpowiedz
Odpowiadając na moje własne pytanie:
to możliwe, aby uzyskać dostęp do właściwości konfiguracyjnych lub całego projektu wtyczki w czasie wykonywania przy użyciu MavenProject
instancję:
/**
* The maven project.
*
* @parameter expression="${project}"
* @readonly
*/
private MavenProject project;
Następnie można uzyskać dostęp do konfiguracji wtyczki w czasie wykonywania:
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
...
Uwaga: Wszelkie zmiany konfiguracji są odrzucane na końcu bieżącej fazy.
Źródło: Best way to access the runtime configuration of a maven plugin from a custom mojo?
Alternatywnie, można pobierać/parametry projektowe szerokości wykorzystujące MavenProject.getProperties()
.
Domyślam się, że sposobem maven byłoby ustawić właściwość w pierwszym Mojo i uzyskać do niego dostęp z innego Mojo.
Czy możesz podać przykładowy kod? – Gili
Testowanie pokazuje, że to nie działa. Zastępstwa właściwości, takie jak te, są rozwiązywane na podstawie ich wartości literowych przed wykonaniem którejkolwiek z wtyczek (myślę, że jest to w momencie utworzenia efektywnego POM). Co działa, jeśli wtyczka, z którą próbujesz się komunikować, ma "wyrażenie" zdefiniowane dla jej parametru, ponieważ jej ocena jest opóźniona, ale dla czegoś, co umieścisz POM w sekcji konfiguracji jednego POM, modyfikacji podczas uruchamiania innej wtyczki jest za późno. – nedruod
Okazuje się to trudną rzeczą, głównie z powodu czasu "konfiguracji" wtyczek przez środowisko wykonawcze Maven. Zmiana "konfiguracji" z getBuildPlugins zazwyczaj nie zadziała.
Najlepsza metoda jest wartością domyślną, jeśli piszesz wtyczkę docelową, w przeciwnym razie użyj właściwości.
Z właściwościami, ale musisz zachować ostrożność, jak korzystasz z właściwości. Należy pamiętać, że jeśli twój POM (lub jakikolwiek rodzic) definiuje wartość dla właściwości, to referencja $ {property} zostanie wymieniona po załadowaniu POM. Jednak jeśli nie ma właściwości "właściwość", odwołanie $ {property} pozostaje i jest zastępowane wartością pustą w ostatniej możliwej chwili.
"Wartość domyślna" jest również oceniana w ostatnim możliwym momencie, i myślę, że jest to bezpieczniejsze rozwiązanie, ponieważ istnieje logiczny powód, dla którego musi zostać oceniony w ostatnim możliwym momencie, gdzie - jako nieistniejący własność może być po prostu szczegółem implementacji, która może ulec zmianie w przyszłych wersjach Maven.
W moim przypadku musiałem uciekać się do nieruchomości, ponieważ chciałem kontrolować "classesDirectory" wtyczki surefire. Chciałem, aby kontynuował domyślne ustawienie $ {project.build.outputDirectory}, gdy Cobertura nie był uruchomiony, ale kiedy uruchomiono Coberturę, chciałem, aby użył $ {project.build.outputDirectory}/generated-classes/cobertura.
zdefiniować w sekcji wtyczek:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<classesDirectory>${instrumentedClassesDirectory}</classesDirectory>
</configuration>
</plugin>
Następnie we wtyczce "source":
getProject().getProperties().put("instrumentedClassesDirectory", coberturaDir);
I upewnij się, pod żadnym pozorem nigdy kłaść jak następuje w dowolnym POM:
<properties>
<instrumentedClassesDirectory>${project.build.outputDirectory}</instrumentedClassesDirectory>
</properties>
ponieważ jeśli to zrobisz, mimo że wartość właściwości jest ustawiona przez wtyczkę źródłową, możesz Wtyczka docelowa r nie zobaczy wartości.Możesz zignorować to ostatnie zastrzeżenie, jeśli korzystasz z właściwości przekazanej do domyślnej wartości wtyczki źródłowej, ale jak powiedziałem w moim przypadku, to nie zadziałałoby, ponieważ nie chciałem zmienić wartości project.build.outputDirectory.
Chociaż jest to najpotężniejszy sposób (+1), sugerowałbym standardowy sposób maven, jak sugeruje pascal (również +1). –
Zobacz odpowiedź [nedruod] (http://stackoverflow.com/a/9024779/14731), jeśli napotkasz jakiekolwiek problemy z tym rozwiązaniem. – Gili
Witam, czy to naprawdę może być używane do przekazywania rzeczy między Mojos? Próbowałem tego rozwiązania, modyfikując konfigurację docelowego Mojo z mojego Mojo. Nigdy nie jest w stanie uzyskać dodatkowej konfiguracji po jej uruchomieniu (w tej samej fazie). –