shell - español - Maven llama script externo en plataformas Linux y Windows
scala ammonite (2)
Finalmente, mezclé las ideas => los <profiles>
se usan para establecer una variable interna script.extension
dependiendo del sistema operativo:
<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>
Luego uso la variable para completar el nombre de archivo del 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>
⚠ Como señaló Maksim para Maven 3.5.4, suba la sección <configuration>
como se muestra a continuación:
<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>
He movido el directorio de trabajo desde el pom.xml
al script de shell. Con el fin de simplificar el mantenimiento, las cosas comunes se mueven dentro de este shell script. Por lo tanto, el archivo por lotes usa este script de 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
Necesito ejecutar un script externo en las plataformas Linux y MS-Windows.
- ¿Utilizo el complemento correcto
exec-maven-plugin
? - ¿Hay un plugin más adecuado?
¿Qué nombre de archivo debo poner en
<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>
Yo uso el mismo Makefile
para ambas plataformas Linux / MS-Windows
Mi script compile-jni.bat
:
call "%ProgramFiles(x86)%/Microsoft Visual Studio 10.0/VC/vcvarsall.bat" x86
bash -c "make"
Mi script compile-jni.sh
:
#!/bin/sh
make
ACTUALIZAR:
Dos colegas han sugerido alternativas:
Use una variable
script.extension
cambiar<executable>./compile-jni${script.extension}</executable>
en elpom.xml
y agregue la variable dentro de la línea de comandosmvn compile -Dscript.extention=.bat
o configure las variables de entorno de Visual Studio antes de llamar a 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)
Pero en ambas soluciones, los usuarios de Eclipse pueden estar atascados ... Todavía estoy buscando una solución automática y elegante ...
Un ejemplo de ejecutar sh script.
Esto solo hace un chmod
para el script sh. Tenga en cuenta que si tiene un script sh, definitivamente debería hacer un chmod
antes de realizar otras operaciones, como ejecutar el script real, de modo que teniendo esto como ejemplo, puede hacer la primera <execution>
como se muestra a continuación y agregar otra <execution>
para ejecutar su script.
Para el archivo por lotes, solo puede tener una <execution>
para ejecutar su 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>
y probablemente querrá agregar un perfil según la máquina en la que se encuentre:
<profiles>
<profile>
<activation>
<os>
<family>!windows</family>
</os>
</activation>
<plugin>
<!-- add your exec-maven-plugin here -->
</plugin>
...
</profile>
</profiles>
Espero que esto sea un comienzo para lo que necesites.