maven calls external script on both Linux and Windows platforms
batch-file, exec-maven-plugin, maven, pom.xml, shell
Solution
Finally, I mixed the ideas => the `<profiles>` are used to set an internal variable `script.extension` depending on the operating system:
<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>
Then I use the variable to complete the script filename:
<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>
⚠ As noticed by Maksim for maven 3.5.4 move up the section `<configuration>` as shown below:
<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>
I have moved the working directory from the `pom.xml` to the shell script. In order to simplify maintenance, the common stuff is moved within this shell scrip. Therefore, the batch file use this shell script:
`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
Problem
I need to run an external script on both Linux and MS-Windows platforms. - Do I use the right plugin `exec-maven-plugin`? - Is there a more suitable plugin? What filename should I put in `<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> ``` I use the same `Makefile` for both platforms Linux/MS-Windows My script `compile-jni.bat`: ``` call "%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86 bash -c "make" ``` My script `compile-jni.sh`: ``` #!/bin/sh make ``` UPDATE: Two colleagues have suggested alternatives: Use a variable `script.extension` change `<executable>./compile-jni${script.extension}</executable>` in the `pom.xml` and append the variable within the command line `mvn compile -Dscript.extention=.bat` or set the Visual Studio environment variables before calling 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) ``` But on both solutions, Eclipse users may be stucked... I am still looking for an automatic and elegant solution...