Подтвердить что ты не робот

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 могут быть застряли... Я все еще ищу автоматическое и элегантное решение...

4b9b3361

Ответ 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>

Надеюсь, что это станет началом того, что вам нужно