Ich möchte Shell-Befehle aus Mavens pom.xml ausführen

105

Ich möchte Linux-Shell-Befehle mit Maven ausführen. Folgendes habe ich versucht:

<plugin>  
  <groupId>org.codehaus.mojo</groupId> 
  <artifactId>exec-maven-plugin</artifactId> 
  <version>1.1.1</version> 
  <executions>
    <execution>
      <goals>
        <goal>exec</goal> 
      </goals>
    </execution>
  </executions>
  <configuration>
    <executable>hostname</executable> 
  </configuration>
</plugin>
NareshKumar
quelle
Bitte bereinigen Sie Ihre Frage und formatieren Sie die Datei pom.xml in Ihrer Frage. Es ist nicht lesbar.
Zengr
12
Ich will nicht unhöflich sein, aber du musst wirklich lernen, wie man Fragen stellt, wir sind nicht psychisch. Was hast du getan? Was hast du bekommen? Was ist das erwartete Ergebnis?
Pascal Thivent

Antworten:

148

Folgendes hat für mich funktioniert:

<plugin>
  <artifactId>exec-maven-plugin</artifactId>
  <groupId>org.codehaus.mojo</groupId>
  <executions>
    <execution><!-- Run our version calculation script -->
      <id>Version Calculation</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>exec</goal>
      </goals>
      <configuration>
        <executable>${basedir}/scripts/calculate-version.sh</executable>
      </configuration>
    </execution>
  </executions>
</plugin>

Curtis
quelle
11
Ich möchte hinzufügen, dass dies mit (mindestens) Version 1.5.0 des Plugins nicht funktioniert, da <configuration />es danach folgen <executions />und nicht darin platziert werden sollte. Ich habe eine ganze Weile gebraucht, um diesen einfachen syntaktischen Fehler zu finden. Mavens Fehlerausgabe ist wirklich nicht so hilfreich.
Joergl
1
Welche Phase oder welches Ziel müssen wir angeben, wenn wir das Skript nach der Bereitstellungsphase ausführen möchten?
Lucy
3
Maven-Phasen sind hier aufgelistet: maven.apache.org/guides/introduction/…
Ed Randall
2
Die Verwendung <workingDirectory>${basedir}/scripts/</workingDirectory>im Konfigurationsblock, anstatt den vollständigen Pfad <executable>
anzugeben,
35

Das Problem hier ist, dass ich nicht weiß, was erwartet wird . Mit Ihrem aktuellen Setup würde das Aufrufen des Plugins in der Befehlszeile einfach funktionieren:

$ mvn exec: exec
[INFO] Nach Projekten suchen ...
[DIE INFO] ----------------------------------------------- -------------------------
[INFO] Gebäude Q3491937
[INFO] Aufgabensegment: [exec: exec]
[DIE INFO] ----------------------------------------------- -------------------------
[INFO] [exec: exec {Ausführung: default-cli}]
[INFO] Laptop
[DIE INFO] ----------------------------------------------- -------------------------
[INFO] ERFOLGREICH BAUEN
[DIE INFO] ----------------------------------------------- -------------------------
...

Das globale configurationwird verwendet, der hostnameBefehl wird ausgeführt ( laptopist mein Hostname). Mit anderen Worten, das Plugin funktioniert wie erwartet.

Wenn Sie nun möchten, dass ein Plugin als Teil des Builds ausgeführt wird , müssen Sie ein Ziel an eine bestimmte Phase binden . Zum Beispiel, um es zu binden compile:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.1.1</version>
    <executions>
      <execution>
        <id>some-execution</id>
        <phase>compile</phase>
        <goals>
          <goal>exec</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <executable>hostname</executable>
    </configuration>
  </plugin>

Und dann:

$ mvn kompilieren
[INFO] Nach Projekten suchen ...
[DIE INFO] ----------------------------------------------- -------------------------
[INFO] Gebäude Q3491937
[INFO] Aufgabensegment: [kompilieren]
[DIE INFO] ----------------------------------------------- -------------------------
[INFO] [Ressourcen: Ressourcen {Ausführung: Standardressourcen}]
[INFO] Verwenden der UTF-8-Codierung zum Kopieren gefilterter Ressourcen.
[INFO] überspringen nicht vorhandenes resourceDirectory / home / pascal / Projects / Q3491937 / src / main / resources
[INFO] [Compiler: Compile {Ausführung: Standard-Compile}]
[INFO] Nichts zu kompilieren - alle Klassen sind aktuell
[INFO] [exec: exec {Ausführung: einige Ausführung}]
[INFO] Laptop
[DIE INFO] ----------------------------------------------- -------------------------
[INFO] ERFOLGREICH BAUEN
[DIE INFO] ----------------------------------------------- -------------------------
...

Beachten Sie, dass Sie ein configurationinnerhalb eines angeben können execution.

Pascal Thivent
quelle
[ERROR] BUILD ERROR [INFO] ------------------------------------------ ------------------------------ [INFO] Ein oder mehrere erforderliche Plugin-Parameter sind für 'exec: exec' ungültig / fehlen [ 0] Geben Sie in der Definition für das Plugin 'exec-maven-plugin' Folgendes an: <configuration> ... <executable> VALUE </ ausführbar> </ configuration> -OR- Geben Sie in der Befehlszeile Folgendes an: '-Dexec. ausführbare Datei = WERT 'Ich erhalte diesen Fehler jetzt.
NareshKumar
2
@ gnash-85: Ich habe immer noch keine Ahnung, was du tust. Ich habe genau das von Ihnen bereitgestellte Snippet verwendet und hatte kein Problem wie oben gezeigt. Bitte aktualisieren Sie Ihre Frage, um zu zeigen, wie Sie maven aufrufen (und wie Ihre aktuelle Konfiguration lautet, wenn Sie etwas geändert haben).
Pascal Thivent
Ich habe den gleichen Code in ein untergeordnetes Modul eingefügt. Und ich versuche, die mvn exec: exec von der übergeordneten pom.xml auszuführen. Und ich bekomme diesen Fehler. Aber wenn ich es einzeln ausführe, funktioniert es.
NareshKumar
5
@ Gnash-85: Das ist normal. Wenn Sie mvn exec:execdas übergeordnete Element aufrufen , führt mvn es für alle Projekte des Builds mit mehreren Modulen aus, einschließlich des übergeordneten Projekts. Das übergeordnete POM hat jedoch keine Konfiguration für das Plugin, die erwartet, dass das executabledefiniert wird, daher die Fehlermeldung.
Pascal Thivent
2
Hinzu kommt diese Diskussion. Wenn Sie Ihre configurationinnerhalb des executionBlocks angeben , funktioniert es, wenn es als Teil einer Gruppe ( mvn install) ausgeführt wird, aber der specify the following: <configuration>Fehler wird ausgelöst, wenn es direkt mit ausgeführt wird mvn exec:exec.
Roo2
19

Gelöst. Das Problem ist, dass die ausführbare Datei unter Linux anders funktioniert. Wenn Sie eine .sh-Datei ausführen möchten, sollten Sie wie folgt schreiben. Schreiben Sie es in pom.xml

    <plugin>
        <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
        <groupId>org.codehaus.mojo</groupId>
        <executions>
            <execution><!-- Run our version calculation script -->
                <id>Renaming build artifacts</id>
                <phase>package</phase>
                <goals>
                    <goal>exec</goal>
                </goals>
                <configuration>
                    <executable>bash</executable>
            <commandlineArgs>handleResultJars.sh</commandlineArgs>
                </configuration>
            </execution>
        </executions>
    </plugin>
james25
quelle
2
Vielen Dank! Für mich als Windows-Benutzer, der Shell-Skripte bevorzugt, war das der Schlüssel!
Ruik
6

2 Optionen:

  1. Sie möchten einen Befehl von maven ausführen, ohne an eine Phase gebunden zu sein. Geben Sie einfach den Befehl ein und maven führt ihn aus . Sie möchten nur maven, um etwas auszuführen. Es ist Ihnen egal, ob wir uns in compile / package / ... befinden Sagen Sie, ich möchte npm startmit Maven laufen , Sie können es mit dem folgenden erreichen:

mvn exec:exec -Pstart-node

Dafür benötigen Sie den folgenden Maven-Abschnitt

  <profiles>
    <profile>
      <id>start-node</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.3.2</version>
            <executions>
              <execution>
                <goals>
                  <goal>exec</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <executable>npm</executable>
              <arguments><argument>start</argument></arguments>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>

  </profiles>
  1. Sie möchten einen beliebigen Befehl von maven ausführen, während Sie sich in einer bestimmten Phase befinden . Wenn ich mich beispielsweise in der Installationsphase befinde , die ich ausführen möchte, können npm installSie dies tun mit:

mvn install

Und damit das funktioniert, benötigen Sie den folgenden Abschnitt:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.3.2</version>
    <executions>

      <execution>
        <id>npm install (initialize)</id>
        <goals>
          <goal>exec</goal>
        </goals>
        <phase>initialize</phase>
        <configuration>
          <executable>npm</executable>
          <arguments>
            <argument>install</argument>
          </arguments>
        </configuration>
      </execution>
Tomer Ben David
quelle
1

Vielen Dank! Tomer Ben David. Es hat mir geholfen. Wie ich gerade mache, installiere Pip im Demo-Ordner, wie du erwähnt hast

<groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.3.2</version>
            <executions>
              <execution>
                <goals>
                  <goal>exec</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <executable>pip</executable>
              <arguments><argument>install</argument></arguments>                            
             <workingDirectory>${project.build.directory}/Demo</workingDirectory>
            </configuration>
Eric
quelle