Je veux exécuter des commandes shell à partir du pom.xml de Maven


105

Je veux exécuter des commandes shell Linux avec Maven. Voici ce que j'ai essayé:

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

Veuillez nettoyer votre question et formater le pom.xml dans votre question. Ce n'est pas lisible.
— zengr

12
Je ne veux pas être impoli mais il faut vraiment apprendre à poser des questions, nous ne sommes pas voyants. Qu'est-ce que tu as fait? Qu'est-ce que vous obtenez? quel est le résultat attendu?
— Pascal Thivent

Réponses:


148

Voici ce qui fonctionne pour moi:

<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
Je voudrais ajouter que cela ne fonctionne pas avec (au moins) la version 1.5.0 du plugin, car <configuration />devrait suivre après <executions />et ne pas y être placé. Il m'a fallu un certain temps pour trouver cette simple erreur syntaxique. La sortie d'erreur de Maven n'est vraiment pas si utile.
— joergl

1
Quelle phase ou quel objectif devons-nous fournir si nous voulons exécuter le script après la phase de déploiement?
— Lucy

3
Les phases Maven sont listées ici: maven.apache.org/guides/introduction/…
— Ed Randall

2
Utiliser <workingDirectory>${basedir}/scripts/</workingDirectory>dans le bloc de configuration, au lieu de donner le chemin complet dans <executable>pourrait également être une bonne idée
— akn

35

Le problème ici est que je ne sais pas à quoi on s'attend . Avec votre configuration actuelle, appeler le plugin sur la ligne de commande fonctionnerait simplement:

$ mvn exec: exec
[INFO] Recherche de projets ...
[INFO] ----------------------------------------------- -------------------------
[INFO] Bâtiment Q3491937
[INFO] segment de tâche: [exec: exec]
[INFO] ----------------------------------------------- -------------------------
[INFO] [exec: exec {exécution: default-cli}]
[INFO] ordinateur portable
[INFO] ----------------------------------------------- -------------------------
[INFO] CONSTRUCTION RÉUSSIE
[INFO] ----------------------------------------------- -------------------------
...

Le global configurationest utilisé, la hostnamecommande est exécutée ( laptopc'est mon nom d'hôte). En d'autres termes, le plugin fonctionne comme prévu.

Maintenant, si vous voulez qu'un plugin soit exécuté dans le cadre de la construction , vous devez lier un objectif sur une phase spécifique. Par exemple, pour le lier sur 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>

Puis:

$ mvn compiler
[INFO] Recherche de projets ...
[INFO] ----------------------------------------------- -------------------------
[INFO] Bâtiment Q3491937
[INFO] segment de tâche: [compiler]
[INFO] ----------------------------------------------- -------------------------
[INFO] [resources: resources {execution: default-resources}]
[INFO] Utilisation de l'encodage 'UTF-8' pour copier les ressources filtrées.
[INFO] ignorer le répertoire de ressources non existant / home / pascal / Projects / Q3491937 / src / main / resources
[INFO] [compilateur: compile {exécution: default-compile}]
[INFO] Rien à compiler - toutes les classes sont à jour
[INFO] [exec: exec {exécution: une certaine exécution}]
[INFO] ordinateur portable
[INFO] ----------------------------------------------- -------------------------
[INFO] CONSTRUCTION RÉUSSIE
[INFO] ----------------------------------------------- -------------------------
...

Notez que vous pouvez spécifier un à l' configurationintérieur d' un fichier execution.


[ERROR] BUILD ERROR [INFO] ------------------------------------------ ------------------------------ [INFO] Un ou plusieurs paramètres de plugin requis sont invalides / manquants pour 'exec: exec' [ 0] Dans la définition du plugin 'exec-maven-plugin', spécifiez ce qui suit: <configuration> ... <executable> VALUE </executable> </configuration> -OU- sur la ligne de commande, spécifiez: '-Dexec. executable = VALUE 'J'obtiens cette erreur maintenant.
— NareshKumar

2
@ gnash-85: Je n'ai toujours aucune idée de ce que vous faites. J'ai utilisé l'extrait exact que vous avez fourni et je n'ai eu aucun problème comme indiqué ci-dessus. Veuillez mettre à jour votre question pour montrer comment vous invoquez maven (et quelle est votre configuration actuelle si vous avez changé quelque chose).
— Pascal Thivent

J'ai mis le même code dans un module enfant. Et j'essaye d'exécuter le mvn exec: exec du parent pom.xml. Et j'obtiens cette erreur. Mais quand je l'exécute individuellement, cela fonctionne.
— NareshKumar

5
@ gnash-85: C'est normal. Lorsque vous mvn exec:execappelez sur le parent, mvn l'exécutera sur tous les projets de la construction multi-module, y compris le parent. Mais le pom parent n'a aucune configuration pour le plugin qui s'attend à ce que le executablesoit défini, d'où le message d'erreur.
— Pascal Thivent

2
Ajoutant à cette discusion. Si vous spécifiez votre configurationintérieur du executionbloc, cela fonctionnera s'il est exécuté dans le cadre d'un groupe ( mvn install), mais renvoie l' specify the following: <configuration>erreur s'il est exécuté directement avec mvn exec:exec.
— roo2

19

Résolu. Le problème est que l'exécutable fonctionne d'une manière différente sous Linux. Si vous souhaitez exécuter un fichier .sh, vous devez écrire de la manière ci-dessous. Écrivez-le dans 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
Merci! Pour moi en tant qu'utilisateur Windows qui préfère les scripts shell, c'était la clé!
— Ruik

6

2 options:

  1. Vous voulez exécuter une commande de maven sans liaison à aucune phase, vous tapez simplement la commande et maven l'exécute , vous voulez juste maven pour exécuter quelque chose, vous ne vous souciez pas si nous sommes dans compile / package / ... dire que je veux courir npm startavec maven, vous pouvez y parvenir avec ce qui suit:

mvn exec:exec -Pstart-node

Pour cela, vous avez besoin de la section maven ci-dessous

  <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. Vous souhaitez exécuter une commande arbitraire de maven pendant que vous êtes à une phase spécifique , par exemple lorsque je suis en phase d'installation que je veux exécuter, npm installvous pouvez le faire avec:

mvn install

Et pour que cela fonctionne, vous aurez besoin de la section ci-dessous:

  <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

Merci! Tomer Ben David. ça m'a aidé. comme je fais pip install dans le dossier de démonstration comme vous l'avez mentionné npm install

<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>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.