2010-10-31 8 views
9

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

6

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().

+0

Chociaż jest to najpotężniejszy sposób (+1), sugerowałbym standardowy sposób maven, jak sugeruje pascal (również +1). –

+0

Zobacz odpowiedź [nedruod] (http://stackoverflow.com/a/9024779/14731), jeśli napotkasz jakiekolwiek problemy z tym rozwiązaniem. – Gili

+0

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). –

2

Domyślam się, że sposobem maven byłoby ustawić właściwość w pierwszym Mojo i uzyskać do niego dostęp z innego Mojo.

+0

Czy możesz podać przykładowy kod? – Gili

+0

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

2

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.