Maven Plugin wird 2 mal ausgeführt

Oneixee5

Top Contributor
Warum wird das Maven-Plugin 2 mal ausgeführt und wie kann ich das verhindern?
Ich starte mit den Parametern: clean verify install
XML:
        <plugins>
            <plugin>
                <artifactId>exec-maven-plugin</artifactId>
                <groupId>org.codehaus.mojo</groupId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <id>npm</id>
                        <phase>package</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <configuration>
                            <executable>${node-path}\npm.cmd</executable>
                            <commandlineArgs>run build</commandlineArgs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
 

KonradN

Super-Moderator
Mitarbeiter
Ach - ich bin blind! Du rufst mit verify und install auf!

das mvn clean verify install ist wie
mvn clean
mvn verify
mvn install


Lifecycle in Maven sind das Stichwort (Siehe auch https://de.wikipedia.org/wiki/Apache_Maven):

clean ist die Phase des CleanLifecycle und damit läuft das da ab.

verify ist der default / build livecycle und der läuft dann durch (grob zusammen gefasst):
validate, compile, test, package (Das Plugin läuft), integration-test, verify

install ist ebenfalls default / build livecycle - daher läuft das alles noch einmal durch wie bei livecycle nur dass nach verify noch install kommt.

==> Du rufst es schlicht zwei mal auf. Nimm das verify raus!
 

Oneixee5

Top Contributor
Es gibt eine pom die etwa 20 Kinder startet. Diese wird vom Buildsystem mit den Parametern: clean verify install gestartet. Meine pom sieht einfach so aus:
XML:
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>...</version>
  <packaging>pom</packaging>
  <properties>
      ...
  </properties>
  <modules>
      <module>ant</module>
       <module>...</module>
       <module>...</module>
    ...
    <module>...</module>
  </modules>
</project>
XML:
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <properties>
       <node-path></node-path>
    </properties>

    <build>

        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
            </plugins>
        </pluginManagement>

        <plugins>
            <plugin>
                <artifactId>exec-maven-plugin</artifactId>
                <groupId>org.codehaus.mojo</groupId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <id>npm</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <configuration>
                            <executable>${node-path}\npm.cmd</executable>
                            <commandlineArgs>run build</commandlineArgs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>

    </build>

    <dependencies>
    </dependencies>
</project>
 

KonradN

Super-Moderator
Mitarbeiter
Ja sorry, meine erste Antwort hatte den Aufruf nicht bedacht.

Diese wird vom Buildsystem mit den Parametern: clean verify install gestartet.
Der Aufruf ist Quatsch. Das install umfasst das verify ja bereits.

Der Aufruf soll im Rahmen von package laufen. package wird sowohl bei verify als auch install durchlaufen, daher: 2 Aufrufe!
 

Robert Zenz

Top Contributor
Auf die Schnelle habe ich diesen Log Eintrag gefunden der augenscheinlich etwas recht aehnliches tut:

Mikael Ståldal hat gesagt.:
In my Maven build, I use exec-maven-plugin to run an external tool for Java code generation. In this case the flatbuffers compiler (flatc).

By default, flatc always runs, so you always get a new .java file. This will always trigger Java compiler to run, which will in turn always trigger jar packaging to run, etc. I would like flatc to only run if it’s source file is updated, so I can get a properly incremental build and avoid needlessly recompiling.

flatc itself is not Java based, it does not support conditional execution, and there is no specific Maven plugin wrapping this tool. (There are specific Maven plugins for some other similar tools, like protoc.)

I was able to do it by using build-helper-maven-plugin, like this:

XML:
<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <version>3.0.0</version>
  <executions>
    <execution>
      <id>fbs-register-sources</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>add-source</goal>
      </goals>
      <configuration>
        <sources>
          <source>${project.build.directory}/generated-sources/flatc</source>
        </sources>
      </configuration>
    </execution>
    <execution>
      <id>check-fbs-compile</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>uptodate-property</goal>
      </goals>
      <configuration>
        <name>flatc.notRequired</name>
        <fileSet>
          <directory>${project.basedir}/src/main/fbs</directory>
          <outputDirectory>${project.build.directory}/generated-sources/flatc</outputDirectory>
          <includes>
            <include>my.fbs</include>
          </includes>
          <mapper>
            <type>merge</type>
            <to>My.java</to>
          </mapper>
        </fileSet>
      </configuration>
    </execution>
  </executions>
</plugin>
<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <executions>
    <execution>
      <id>fbs-compile</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>exec</goal>
      </goals>
      <configuration>
        <skip>${flatc.notRequired}</skip>
        <!-- ... -->
 

KonradN

Super-Moderator
Mitarbeiter
Also ich kann Dir nur Erläutern, was Maven da macht. Jenkins ruft das somit zwei Mal auf und damit läuft es zwei mal.

Ich kann Dir auch sagen, dass so ein Aufruf keinen Sinn macht.

Evtl. noch zur Verdeutlichung: Maven hat Lifecycle. Und da gibst Du etwas an.
Lifecycle gibt es 3 Stück:
Clean: pre-clean, clean, post-clean
Site: pre-site, site, post-site, site-deploy
Build (default): validate, initialize, generate-sources, .... package, ..., verify, install, deploy

Bei build habe ich einiges weggelassen und "..." gesetzt - die ganze Liste findet sich unter https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#default-lifecycle

Maven nimmt nun (u.a.) sowas wie ziele entgegen. Diese können auch Plugin Dinge sein - das wäre dann sowas wie das javafx:run oder so, das Du vielleicht schon einmal gesehen hast. Oder es sind Schritte eines Livecycles. Wenn es ein Schritt eines Lifecycles ist, dann werden alle Schritte des Livecycles durchlaufen.

bei mvn clean verify install bedeutet dies:
clean (Clean Lifecycle): pre-clean, clean
verify: validate, initialize, ...., package, pre-integration-test, integration-test, post-integreation-test, verify
install:
validate, initialize, ...., package, pre-integration-test, integration-test, post-integreation-test, verify, install

Es wird also zwei Mal die Phase package durchlaufen und bei der Phase package soll nun einmal das ausgeführt werden. Also wird es zwei mal ausgeführt.


Generell ist die Ausführung von npm install im package Lauf zumindest problematisch. Damit läuft es erst nach dem zusammenpacken. Ich habe mal ein exec Task gebaut, der Hello World! ausgibt und beim Lauf sieht man dann:
Code:
[INFO] --- maven-jar-plugin:3.2.2:jar (default-jar) @ fizzbuzz ---
[INFO] Building jar: /Users/konrad/Projects/GitHub/JavaMavenApp/target/fizzbuzz-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- exec-maven-plugin:3.1.0:exec (npm) @ fizzbuzz ---
Hello world!

Das jar File (oder war, zip, was auch immer) ist schon gepackt und dann läuft npm erst. Das ist blöd, denn nach dem npm install kommt evtl noch ein npm run build oder so? Und das Ergebnis landet evtl. in den Ressourcen und soll dann von einer Spring Boot / Quarkus / Jakarta EE / was auch immer mit ausgeliefert werden? (Oder ein ZIP File das dann jemand auf einem Server entpackt oder oder oder ... Fakt ist: Package ist durch und dann kommt npm erst daher ...)

Wenn so ein Problem gesehen wurde, dann ist das evtl. die Lösung gewesen: Nach package kommt verify ... wir lassen verify laufen und dann das install ... dann läuft es zwei Mal und wir haben einen Build der Webapp im Backend? Aber das ist nur geraten.

Eigentlich sollte man es einfach nur früher laufen lassen - ich lasse es bei mir in generate-sources laufen. Aber da es vor package schon ausreichen würde, wäre auch ein pre-package denkbar.

Das war jetzt auch etwas Spekulation. Fakt ist leider: Ich kann nur das Verhalten erklären.

Eine direkte Lösung gibt es nicht außer vielleicht: Wenn dieser Lauf wirklich nur einmal laufen soll und das, was da passiert für spätere Phasen egal ist: Dann ändere die Phase von package auf install. Beim verify Lauf wird es nicht ausgeführt und beim install Lauf läuft es am Ende. Aber dann hast Du das halt nicht, wenn jemand bei package es packen will oder bei integration-test testen.
 

Oneixee5

Top Contributor
Ich habe noch mal mit den Leuten gesprochen die das Build gebaut haben. Die meinten bei install werden Software-Stücklisten gebaut. Das soll aber nur passieren, wenn alle Kind-Pom verify durchlaufen haben. So soll verhindert werden, das Software-Stücklisten für Module veröffentlicht werden, welche dann nie rausgehen, weil das letzte Modul nicht gebaut werden kann. Also alle oder keiner. Das läuft entweder darauf hinaus, dass ich das Build ändern muss, inkl. alles testen und verantworten oder ich lebe damit, dass es zwei mal läuft - na dann soll es so sein.

Die Phase war mir erst mal gar nicht so wichtig, ich wollte nur mal testen ob ich das so einbinden kann. Dabei bin ich eben über den doppelten Lauf gestolpert. Ich müsste dann wahrscheinlich npm run build in die install-Phase einbinden und npm audit in der verify-Phase - auch wenn das dann doppelt läuft.
 

KonradN

Super-Moderator
Mitarbeiter
Ok, danke für das Nachfragen und die Erklärung.

Bei sowas kann dann tatsächlich so ein conditional build interessant sein. Das lässt sich zwar über Maven abdecken (Danke @Robert Zenz - das war interessant, weil ich das so noch nicht kannte), aber ich denke, ich würde das einfach über eine Scriptlösung umsetzen.

Es wird dann einfach ein build Script gestartet, das dann eine Datei vom Alter prüft und dann entscheidet, ob etwas laufen soll.

Bei npm install kann es sogar einfach diese packages.json oder wie die Datei heisst, sein. Wenn die nicht neuer ist als die heruntergeladenen Module und so, dann muss es nicht laufen, oder?

Aber es kann auch einfach eine Datei sein, die man prüft. Was ist der zeitliche Ablauf? Wenn eine Datei da ist und jünger ist als 5 Minuten (das halt sinnvoll anpassen), dann wird nichts gemacht. Ansonsten kommt ein touch auf die Datei + dem, was man machen will.

Das wären so auf Anhieb meine Ansätze. Aber das habe ich bisher so noch nicht gebraucht, daher sind das auch nicht mehr als schnelle Ideen bei einem Brainstorming, die bewertet und im Detail durchdacht (und dann erneut bewertet) werden müssten.
 

Oneixee5

Top Contributor
Ich denke ich rufe einfach in maven-install - npm run build auf, bei verify läuft das dann nicht. Also müsste es nur einmal laufen. Das Build erzeugt am Ende nur ein kleines Frontend (Vue.js) und kopiert es auf einen Apache. Mal sehn ob es so funktioniert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
elischa Eclipse Plugin Projekt, Maven Projekt und dependencies Java Basics - Anfänger-Themen 5
M Frage zu Maven Plugin für Eclipse IDE Java Basics - Anfänger-Themen 1
G Merkwürdiges Verhalten der Maven IDE Java Basics - Anfänger-Themen 3
G Maven Swing: Wie verwende ich WindowListener ? Java Basics - Anfänger-Themen 2
M mit Maven eine ausführbare Jar bauen Java Basics - Anfänger-Themen 7
W Datenbankverbindung mit Maven konfigurieren Java Basics - Anfänger-Themen 11
D maven dependencies re-importieren in intellij Java Basics - Anfänger-Themen 5
C External Jar einbinden bei Maven Java Basics - Anfänger-Themen 9
T JavaFX2/maven Java Basics - Anfänger-Themen 7
C Einbinden von Komponenten mit Maven Java Basics - Anfänger-Themen 3
T Start-Activity für Java Maven Web-Anwendung festlegen Java Basics - Anfänger-Themen 2
S Maven und externe Library Java Basics - Anfänger-Themen 2
P Maven-Dependencies (package org.apache.http.nio does not exist) Java Basics - Anfänger-Themen 6
D MAVEN Java Basics - Anfänger-Themen 3
B Arquillian installieren - Maven, WildFly, MYSQL Java Basics - Anfänger-Themen 1
O Maven Java Basics - Anfänger-Themen 10
T gradle, maven, ant - was ist das? Java Basics - Anfänger-Themen 2
P Maven und eigene Jars Java Basics - Anfänger-Themen 4
M Maven Main-Methode Interface und Klasse Java Basics - Anfänger-Themen 2
A JavaScript Object Notation einbinden mittels Maven Java Basics - Anfänger-Themen 7
M Warum ist Maven als Technologie eigentlich so sicher? Java Basics - Anfänger-Themen 0
M Frage zu Maven Lifecycles Java Basics - Anfänger-Themen 2
M Maven Dependency im Java Projekt Java Basics - Anfänger-Themen 1
K Maven Dependency unklar Java Basics - Anfänger-Themen 5
M Bestehendes Projekt auf Maven umstellen? Java Basics - Anfänger-Themen 5
G Maven Dependency für Oracle JDBC-Driver korrekt festlegen Java Basics - Anfänger-Themen 4
G Erstellen eines Maven Projektes mit Eclipse Java Basics - Anfänger-Themen 9
F frage zu maven Java Basics - Anfänger-Themen 2
G Unterschied zwischen Ant und Maven Java Basics - Anfänger-Themen 9
U Spigot-Plugin Java Basics - Anfänger-Themen 0
R Mein Plugin funktioniert nicht? Java Basics - Anfänger-Themen 10
sensus Jigloo Plugin Sicherheitswarnung Java Basics - Anfänger-Themen 0
C JOptionPane tritt manchmal bei Plugin in den Hintergrund Java Basics - Anfänger-Themen 2
P Wie Java-Plugin in Firefox (nachträglich) installieren? Java Basics - Anfänger-Themen 2
C Fragen zum Spigot Plugin (1.8) Java Basics - Anfänger-Themen 6
TheFischPlayz Erste Schritte Plugin Wird Nicht angezeigt ? Java Basics - Anfänger-Themen 4
P Wie Java-Plugin in Browser installieren OHNE volles Java ausserhalb? *.jnlp not startable Java Basics - Anfänger-Themen 1
M Frage zum Confilctauflösen in SVN (Eclipse Plugin) Java Basics - Anfänger-Themen 3
B Java Plugin im Firefox abschalten Java Basics - Anfänger-Themen 3
L Java Bukkit Plugin + config.yml Java Basics - Anfänger-Themen 5
C [Bukkit Plugin] Blöcke eine bestimmte route entlang fliegen Java Basics - Anfänger-Themen 3
L Bukkit Plugin Scanner Java Basics - Anfänger-Themen 2
M Java Bukkit Plugin (selbst erstellt) Java Basics - Anfänger-Themen 9
A Erstellung eines einfachen Plugin HILFE ! Java Basics - Anfänger-Themen 19
M PlugIn System - GUI Java Basics - Anfänger-Themen 8
C Netbeans will Plugin mangelns JDK nicht installieren ? Java Basics - Anfänger-Themen 2
sc0p Plugin VE/JEdit etc. starten Java Basics - Anfänger-Themen 3
A langsames Java-Browser-Plugin für knuddels.de Java Basics - Anfänger-Themen 8
S Kennt jemand die Default-Cache Zeit beim Java-Plugin? Java Basics - Anfänger-Themen 2
T Plugin-Dependencies bearbeiten Java Basics - Anfänger-Themen 15
K Entwicklungsumgebung Eclipse und Visual Editor Plugin Java Basics - Anfänger-Themen 5
R Velocity Plugin installieren Java Basics - Anfänger-Themen 6
K 2 x "Next" im Plugin Java Basics - Anfänger-Themen 7
P mp3-PlugIn installieren Java Basics - Anfänger-Themen 2
S Wie programmiert man ein Plugin-System in Java? Java Basics - Anfänger-Themen 4
K Eclipse - Sysdeo Plugin - Tomcat Server Java Basics - Anfänger-Themen 2
D Apache.Xerces unter Eclispe? import/plugin/package? Java Basics - Anfänger-Themen 2
G Plugin in Eclipse einbinden Java Basics - Anfänger-Themen 5
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
T if-else Bedingung wird ignoriert Java Basics - Anfänger-Themen 4
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
P Webseite vom Smartmeter wird nur unleserlich angezeigt Java Basics - Anfänger-Themen 7
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
T catch(InputMismatchException) wird nicht ausgefürt/erkannt Java Basics - Anfänger-Themen 12
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
C Was tun wenn .class erwartet wird ? Java Basics - Anfänger-Themen 6
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
MiMa Ungültiges Datum wird nicht erkannt ?? Java Basics - Anfänger-Themen 6
schemil053 Multithread - Input verrutscht während etwas ausgegeben wird Java Basics - Anfänger-Themen 6
K REGEX - Rechnungsbetrag wird nicht richtig ausgelesen. Java Basics - Anfänger-Themen 3
_user_q Timer - ScheduledExecutorService wird schon vorher beendet Java Basics - Anfänger-Themen 5
X Erste Schritte Scanner eingabe wird übersprungen Java Basics - Anfänger-Themen 4
H Compiler-Fehler Klasse in einem Package wird nicht gefunden bzw. akzeptiert Java Basics - Anfänger-Themen 12
L Switch-Case Multiplikation wird nicht ausgegeben Java Basics - Anfänger-Themen 1
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
M Text wird in der Console nicht ausgegeben. Java Basics - Anfänger-Themen 11
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Zweidimensionales Array [][] wird untereinander ausgegeben Java Basics - Anfänger-Themen 14
sserio Math. Befehl wird rot markiert Java Basics - Anfänger-Themen 5
M Rechteck wird nicht angezeigt Java Basics - Anfänger-Themen 3
B Bungeecord | ProxiedPlayer wird nicht in ArrayList hinzugefügt Java Basics - Anfänger-Themen 1
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
S Methoden Return Rückgabewert wird nicht übergeben Java Basics - Anfänger-Themen 8
M Mein quellcode wird nicht in der Konsole ausgegeben Java Basics - Anfänger-Themen 3
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
M wird der Konstruktor nicht als 1. ausgeführt? Java Basics - Anfänger-Themen 13
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben