Maven вызывает внешние script на платформах Linux и Windows
Мне нужно запустить внешний script на платформах Linux и MS-Windows.
- Использовать ли правильный плагин
exec-maven-plugin
?
- Есть ли более подходящий плагин?
-
Какое имя файла следует помещать в <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>
Я использую тот же Makefile
для обеих платформ Linux/MS-Windows
Мой script compile-jni.bat
:
call "%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
bash -c "make"
Мой script compile-jni.sh
:
#!/bin/sh
make
UPDATE:
Два коллеги предложили альтернативы:
-
Используйте переменную script.extension
измените <executable>./compile-jni${script.extension}</executable>
на pom.xml
и добавьте переменную в командной строке mvn compile -Dscript.extention=.bat
-
или установите переменные среды Visual Studio перед вызовом 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)
Но на обоих решениях пользователи Eclipse могут быть застряли... Я все еще ищу автоматическое и элегантное решение...
Ответы
Ответ 1
Наконец, я смешал идеи = > <profiles>
, чтобы установить внутреннюю переменную script.extension
в зависимости от операционной системы:
<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>
Затем я использую переменную для завершения имени файла 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>
Я переместил рабочий каталог из pom.xml
в оболочку script. Чтобы упростить обслуживание, общий материал перемещается внутри этого сценария оболочки. Поэтому командный файл использует эту оболочку 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
Ответ 2
Пример запуска sh script.
Это просто a chmod
для sh script. Имейте в виду, если у вас есть sh script, вы должны обязательно выполнить chmod
перед выполнением других операций, таких как запуск фактического script, поэтому, имея в качестве примера, вы можете сделать первый <execution>
, как показано ниже и добавьте еще один <execution>
, чтобы запустить script.
Для командного файла вы можете использовать только один <execution>
для запуска 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>
и вы, вероятно, захотите добавить профиль в зависимости от того, на каком компьютере вы находитесь:
<profiles>
<profile>
<activation>
<os>
<family>!windows</family>
</os>
</activation>
<plugin>
<!-- add your exec-maven-plugin here -->
</plugin>
...
</profile>
</profiles>
Надеюсь, что это станет началом того, что вам нужно