J'ai besoin d'exécuter un script externe sur les plates-formes Linux et MS-Windows.
exec-maven-plugin
?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
Deux collègues ont suggéré des alternatives:
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
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 ...
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
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