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>
NareshKumar
la source
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>

Curtis
la source
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.

Pascal Thivent
la source
[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>
James25
la source
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>
Tomer Ben David
la source
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>
Eric
la source