web-dev-qa-db-fra.com

maven appelle un script externe sur les plates-formes Linux et Windows

J'ai besoin d'exécuter un script externe sur les plates-formes Linux et MS-Windows.

  1. Dois-je utiliser le bon plugin exec-maven-plugin?
  2. Existe-t-il un plugin plus adapté?
  3. Quel nom de fichier dois-je mettre <executable>....</executable>?

    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>1.2.1</version>
        <executions>
            <execution>
                <id>compile-jni</id>
                <phase>compile</phase>
                <goals>
                    <goal>exec</goal>
                </goals>
                <configuration>
                    <executable>./compile-jni</executable>
                    <workingDirectory>${basedir}/src/main/cpp</workingDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

J'utilise le même Makefile pour les deux plateformes Linux/MS-Windows

Mon script compile-jni.bat:

call "%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
bash -c "make" 

Mon script compile-jni.sh:

#!/bin/sh
make

METTRE À JOUR:

Deux collègues ont suggéré des alternatives:

  1. Utilisez une variable script.extension changement <executable>./compile-jni${script.extension}</executable> dans le pom.xml et ajoutez la variable dans la ligne de commande mvn compile -Dscript.extention=.bat

  2. ou définissez les variables d'environnement Visual Studio avant d'appeler maven:

    call "C:\%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
    mvn compile #(the same script 'bash -c "make"' works on both platforms)
    

Mais sur les deux solutions, les utilisateurs d'Eclipse peuvent être bloqués ... Je suis toujours à la recherche d'une solution automatique et élégante ...

23
olibre

Enfin, j'ai mélangé les idées => les <profiles> sont utilisés pour définir une variable interne script.extension selon le système d'exploitation:

<profiles>
  <profile>
    <id>Windows</id>
    <activation>
      <os>
        <family>Windows</family>
      </os>
    </activation>
    <properties>
      <script.extension>.bat</script.extension>
    </properties>
  </profile>
  <profile>
    <id>unix</id>
    <activation>
      <os>
        <family>unix</family>
      </os>
    </activation>
    <properties>
      <script.extension>.sh</script.extension>
    </properties>
  </profile>
</profiles>

Ensuite, j'utilise la variable pour compléter le nom de fichier du script:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>1.2.1</version>
  <executions>
    <execution>
      <id>compile-jni</id>
      <phase>compile</phase>
      <goals>
        <goal>exec</goal>
      </goals>
      <configuration>
        <executable>./compile-jni${script.extension}</executable>
      </configuration>
    </execution>
  </executions>
</plugin>


⚠ Comme remarqué par Maksim pour maven 3.5.4 monter la section <configuration> comme indiqué ci-dessous:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <configuration>
    <executable>./compile-jni${script.extension}</executable>
  </configuration>
  <version>1.2.1</version>
  <executions>
    <execution>
      <id>compile-jni</id>
      <phase>compile</phase>
      <goals>
        <goal>exec</goal>
     </goals>
    </execution>
  </executions>
</plugin>

J'ai déplacé le répertoire de travail du pom.xml au script Shell. Afin de simplifier la maintenance, les éléments communs sont déplacés dans ce script Shell. Par conséquent, le fichier de commandes utilise ce script Shell:

compile-jni.bat:

call "%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
bash compile-jni.sh

compile-jni.sh:

#!/bin/sh
cd src/main/cpp
make
38
olibre

Un exemple d'exécution du script sh.

Cela fait juste un chmod pour le script sh. Gardez à l'esprit que si vous avez un script sh, vous devez certainement faire un chmod avant d'effectuer d'autres opérations telles que l'exécution du script réel, vous pouvez donc faire le premier <execution> comme ci-dessous et ajoutez un autre <execution> pour exécuter votre script.

Pour le fichier de commandes, vous ne pouvez avoir qu'un seul <execution> pour exécuter votre script

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>${org.codehaus.mojo.version}</version>
            <executions>
               <execution>
                    <id>script-chmod</id>
                    <phase>install</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                    <configuration>
                        <executable>chmod</executable>
                        <arguments>
                            <argument>+x</argument>
                            <argument>yourscript.sh</argument>
                        </arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>

et vous voudrez probablement ajouter un profil en fonction de la machine que vous utilisez:

<profiles>
  <profile>
    <activation>
      <os>
        <family>!windows</family>
      </os>
    </activation>
    <plugin>
      <!-- add your exec-maven-plugin here -->
    </plugin>
    ...
  </profile>
</profiles>

J'espère que ce sera un début pour ce dont vous avez besoin

5
Andrei Sfat