Voglio eseguire i comandi della shell dal pom.xml di Maven


105

Voglio eseguire i comandi della shell di Linux con Maven. Ecco cosa ho provato:

<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>

per favore pulisci la tua domanda e formatta il pom.xml nella tua domanda. Non è leggibile.
zengr

12
Non voglio essere scortese, ma devi davvero imparare a fare domande, non siamo dei sensitivi. Che cosa hai fatto? Cosa hai preso? Qual è il risultato atteso?
Pascal Thivent

Risposte:


148

Ecco cosa ha funzionato per me:

<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>


11
Vorrei aggiungere che questo non funziona con (almeno) la versione 1.5.0 del plugin, poiché <configuration />dovrebbe seguire <executions />e non essere inserito al suo interno. Mi ci è voluto un po 'per trovare questo semplice errore sintattico. L'output di errore di Maven non è davvero così utile.
joergl

1
Quale fase o obiettivo dobbiamo fornire se vogliamo eseguire lo script dopo la fase di distribuzione?
Lucy

3
Le fasi di Maven sono elencate qui: maven.apache.org/guides/introduction/…
Ed Randall

2
Utilizzare <workingDirectory>${basedir}/scripts/</workingDirectory>nel blocco di configurazione, invece di fornire il percorso completo <executable>potrebbe anche essere una buona idea
akn

35

Il problema qui è che non so cosa ci si aspetta . Con la configurazione corrente, invocare il plug-in sulla riga di comando funzionerebbe:

$ mvn exec: exec
[INFO] Scansione dei progetti ...
[INFORMAZIONI] ----------------------------------------------- -------------------------
[INFO] Edificio Q3491937
[INFO] segmento di attività: [exec: exec]
[INFORMAZIONI] ----------------------------------------------- -------------------------
[INFO] [exec: exec {esecuzione: default-cli}]
[INFO] laptop
[INFORMAZIONI] ----------------------------------------------- -------------------------
[INFO] COSTRUISCI CON SUCCESSO
[INFORMAZIONI] ----------------------------------------------- -------------------------
...

configurationViene utilizzato il global , hostnameviene eseguito il comando ( laptopè il mio hostname). In altre parole, il plugin funziona come previsto.

Ora, se vuoi che un plugin venga eseguito come parte della build , devi vincolare un obiettivo in una fase specifica. Ad esempio, per associarlo a 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>

E poi:

$ mvn compilare
[INFO] Scansione dei progetti ...
[INFORMAZIONI] ----------------------------------------------- -------------------------
[INFO] Edificio Q3491937
[INFO] segmento di attività: [compilazione]
[INFORMAZIONI] ----------------------------------------------- -------------------------
[INFO] [risorse: risorse {esecuzione: risorse predefinite}]
[INFO] Utilizzo della codifica "UTF-8" per copiare le risorse filtrate.
[INFO] salta risorsa non esistente Directory / home / pascal / Projects / Q3491937 / src / main / resources
[INFO] [compilatore: compile {esecuzione: default-compile}]
[INFO] Niente da compilare - tutte le classi sono aggiornate
[INFO] [exec: exec {execution: some-execution}]
[INFO] laptop
[INFORMAZIONI] ----------------------------------------------- -------------------------
[INFO] COSTRUISCI CON SUCCESSO
[INFORMAZIONI] ----------------------------------------------- -------------------------
...

Nota che puoi specificare un configurationall'interno di un file execution.


[ERRORE] BUILD ERROR [INFO] ------------------------------------------ ------------------------------ [INFO] Uno o più parametri del plug-in obbligatori non sono validi / mancanti per "exec: exec" [ 0] All'interno della definizione del plugin "exec-maven-plugin" specificare quanto segue: <configuration> ... <executable> VALUE </executable> </configuration> -OPPURE- sulla riga di comando, specificare: '-Dexec. eseguibile = VALUE 'Ricevo questo errore ora.
NareshKumar

2
@ gnash-85: non ho ancora idea di cosa stai facendo. Ho usato lo snippet esatto che hai fornito e non ho avuto problemi come mostrato sopra. Aggiorna la tua domanda per mostrare come invochi Maven (e qual è la tua configurazione attuale se hai cambiato qualcosa).
Pascal Thivent

Ho inserito lo stesso codice in un modulo figlio. E sto cercando di eseguire mvn exec: exec dal genitore pom.xml. E ottengo questo errore. Ma quando lo eseguo individualmente funziona.
NareshKumar

5
@ gnash-85: è normale. Quando invocate mvn exec:execil genitore, mvn lo eseguirà su tutti i progetti della build multi-modulo, incluso il genitore. Ma il genitore pom non ha alcuna configurazione per il plugin che si aspetta che executablevenga definito, da qui il messaggio di errore.
Pascal Thivent

2
Aggiungendo a questa discussione. Se specifichi il tuo configurationall'interno del executionblocco, funzionerà se eseguito come parte di un group ( mvn install) ma genererà l' specify the following: <configuration>errore se eseguito direttamente con mvn exec:exec.
roo2

19

Risolto. Il problema è che l'eseguibile funziona in modo diverso in Linux. Se vuoi eseguire il file .sh, dovresti scrivere nel modo seguente. Scrivilo 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>

2
Grazie! Per me come utente Windows che preferisce gli script di shell, quella era la chiave!
Ruik

6

2 opzioni:

  1. Vuoi eseguire un comando da Maven senza legarti a nessuna fase, digita semplicemente il comando e Maven lo esegue , vuoi solo Maven per eseguire qualcosa, non ti interessa se siamo in compilazione / pacchetto / ... dì che voglio correre npm startcon Maven, puoi ottenerlo con il seguente:

mvn exec:exec -Pstart-node

Per questo hai bisogno della sezione Maven qui sotto

  <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. Vuoi eseguire un comando arbitrario da Maven mentre sei in una fase specifica , ad esempio quando sono nella fase di installazione che voglio eseguire npm installpuoi farlo con:

mvn install

E affinché funzioni avresti bisogno della sezione seguente:

  <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>

1

Grazie! Tomer Ben David. mi ha aiutato. poiché sto eseguendo l'installazione di pip nella cartella demo come hai menzionato l'installazione di npm

<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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.