Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[maven-plugin¨] Arrays einlesen

7 views
Skip to first unread message

Peter Müller

unread,
Oct 15, 2023, 1:19:28 PM10/15/23
to
Ich will ein Maven-Plugin verschiedene Werte einlesen. Der folgende Code
gibt aber nur "ddd" aus.


<plugin>
<groupId>com.peter</groupId>
<artifactId>my-plugin</artifactId>
<version>1.0.10-SNAPSHOT</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>myGoal</goal>
</goals>
<inherited>false</inherited>
<configuration>
<hellos>
<hello>aaa</hello>
<hello>bbb</hello>
</hellos>
<hellos>ccc</hellos>
<hellos>ddd</hellos>
</configuration>
</execution>

</executions>
</plugin>

Ich habe verschiedene Sachen ausprobiert, dies ist der aktuelle Code:

@Mojo(name = "myGoal")
public class MyPlugin extends AbstractMojo {

// (property = "hellos")

@Parameter(property = "hellos")
private String[] hellos;

@Override
public void execute() throws MojoExecutionException {
getLog().info("*****************************************");
getLog().info("*****************************************");
getLog().info("Hello, world.");
for (String hello : hellos) {
getLog().info(hello);
}
getLog().info("*****************************************");
getLog().info("*****************************************");
}

public void setHellos(String[] hellos) {
this.hellos = hellos;
getLog().info("*****************************************");
getLog().info("*****************************************");
getLog().info("Hallo, Welt.");
for (String hello : hellos) {
getLog().info(hello);
}
getLog().info("*****************************************");
getLog().info("*****************************************");
}
}

Peter Müller

unread,
Oct 15, 2023, 1:37:52 PM10/15/23
to
Ich meinte, dass ich ein Maven-Plugin schreiben möchte, mit dem ich
verschiedene Werte einlesen kann.

Patrick Roemer

unread,
Oct 15, 2023, 4:06:09 PM10/15/23
to
Responding to Peter Müller:
> Ich will ein Maven-Plugin verschiedene Werte einlesen. Der folgende Code
> gibt aber nur "ddd" aus.

https://maven.apache.org/guides/mini/guide-configuring-plugins.html#Mapping_Collections_and_Arrays

Funktioniert das? Was fehlt Dir bei diesem Ansatz?

> public void setHellos(String[] hellos) {
> this.hellos = hellos;
> getLog().info("*****************************************");
> getLog().info("*****************************************");
> getLog().info("Hallo, Welt.");
> for (String hello : hellos) {
> getLog().info(hello);
> }
> getLog().info("*****************************************");
> getLog().info("*****************************************");
> }
> }

Was ist die Logging-Ausgabe? (Kann man das Logging ggfs.
erweitern/verbessern?) Wie oft/wann wird #setHellos() demzufolge aufgerufen?

Peter Müller

unread,
Oct 15, 2023, 4:44:12 PM10/15/23
to
Eben gerade habe ich festgestellt, dass wenn die Zeilen

<hellos>ccc</hellos>
<hellos>ddd</hellos>

weg sind, dass es dann funktioniert. Ich hatte schon verschiedene Sachen
ausprobiert und nichts hat geholfen. Jetzt funktioniert es plötzlich.
Map funktioniert auch.
Aber ich habe keine Ahnung wie man es anstellt, dass (optionale)
Childtags ausgewertet können.

Patrick Roemer

unread,
Oct 16, 2023, 6:57:08 AM10/16/23
to
Responding to Peter Müller:
> Eben gerade habe ich festgestellt, dass wenn die Zeilen
>
> <hellos>ccc</hellos>
> <hellos>ddd</hellos>
>
> weg sind, dass es dann funktioniert.

Es funktioniert genau wie zuvor, das letzte "hellos"-Element dürfte
"gewinnen". #setHellos() sollte dafür nicht benötigt werden.

> Aber ich habe keine Ahnung wie man es anstellt, dass (optionale)
> Childtags ausgewertet können.

Was genau bedeutet das, und wie hängt das mit dem vorherigen Beispiel
zusammen, in dem eine Collection (bzw. eben ein Array) als Parameter
eingelesen wird?

Die Doku[1] ist tatsächlich nicht besonders aussagekräftig/detailliert
bzgl. optionaler Werte. Fehlende Config-Einträge für Toplevel-Parameter
mit "required = false" dürften aber schlicht das zugehörige Feld auf dem
initialen Wert (z.B. null) belassen, bzw., falls angegeben, auf den Wert
von "defaultValue" setzen.

Ob/wie optionale Felder in komplexen Parametern unterstützt werden, sehe
ich auf Anhieb nicht, da müsste man evtl. wirklich experimentieren
und/oder nach Dokumentation aus dritter Hand graben.

[1]
https://maven.apache.org/guides/mini/guide-configuring-plugins.html#Configuring_Parameters

Peter Müller

unread,
Oct 16, 2023, 8:31:20 AM10/16/23
to
Patrick Roemer schrieb:
> Responding to Peter Müller:
>> Eben gerade habe ich festgestellt, dass wenn die Zeilen
>>
>>                                <hellos>ccc</hellos>
>>                                <hellos>ddd</hellos>
>>
>> weg sind, dass es dann funktioniert.
>
> Es funktioniert genau wie zuvor, das letzte "hellos"-Element dürfte
> "gewinnen". #setHellos() sollte dafür nicht benötigt werden.
>
>> Aber ich habe keine Ahnung wie man es anstellt, dass (optionale)
>> Childtags ausgewertet können.
>
> Was genau bedeutet das, und wie hängt das mit dem vorherigen Beispiel
> zusammen, in dem eine Collection (bzw. eben ein Array) als Parameter
> eingelesen wird?

Das hat mit dem Beispiel noch nichts zu tun, außer dass es eine Vorstufe
für verschachtelte Tags sind, wie z.B. bei:

<configuration>
<tiere>
<saeugetiere>
<hoehereSaeugetiere>
<raubtiere>
<hunde>
...
</hunde>
</raubtiere>
</hoehereSaeugetiere>
</saeugetiere>
</tiere>
</configuration>
>

> Die Doku[1] ist tatsächlich nicht besonders aussagekräftig/detailliert
> bzgl. optionaler Werte. Fehlende Config-Einträge für Toplevel-Parameter
> mit "required = false" dürften aber schlicht das zugehörige Feld auf dem
> initialen Wert (z.B. null) belassen, bzw., falls angegeben, auf den Wert
> von "defaultValue" setzen.
>

Ich habe sogar ein Mavenbuch. Da steht aber kein Hinweis, wie man die
Verschachtelung im Griff bekommt.


Patrick Roemer

unread,
Oct 16, 2023, 2:00:45 PM10/16/23
to
Responding to Peter Müller:
> Das hat mit dem Beispiel noch nichts zu tun, außer dass es eine Vorstufe
> für verschachtelte Tags sind, wie z.B. bei:
>
> <configuration>
> <tiere>
> <saeugetiere>
> <hoehereSaeugetiere>
> <raubtiere>
> <hunde>
> ...
> </hunde>
> </raubtiere>
> </hoehereSaeugetiere>
> </saeugetiere>
> </tiere>
> </configuration>

Das Beispiel ist so, für ein Buildsystem nicht besonders realitätsnah,
unvollständig, mit großer Schachtelungstiefe, dafür ohne Verzweigung,
und insbesondere ohne eine Datenstruktur, auf die der Spaß gemappt
werden soll, nicht richtig hilfreich.

Aber ich vermute mal, es wird halt aufs Mapping von "complex objects"
mit Feldern von Collections herauslaufen. Das scheint bei Maven selber
nicht hinreichend dokumentiert. Vielleicht bei der darunterliegenden
Mapping-Bibliothek (Sisu? Plexus? Guice? Keine Ahnung...), aber da ist
es vermutlich einfacher, selber zu experimentieren, als das zu finden.
Viel Spaß! :)

0 new messages