maven вызывает внешний скрипт на платформах Linux и Windows

Мне нужно запустить внешний скрипт как на платформах Linux, так и на платформах MS-Windows.

  1. Я использую правильный плагин exec-maven-plugin?
  2. Есть ли более подходящий плагин?
  3. Какое имя файла я должен поставить в <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

Мой сценарий compile-jni.bat:

call "%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
bash -c "make" 

Мой сценарий compile-jni.sh:

#!/bin/sh
make

ОБНОВИТЬ:

Два коллеги предложили альтернативы:

  1. Используйте переменную script.extension, измените <executable>./compile-jni${script.extension}</executable> в pom.xml и добавьте переменную в командную строку mvn compile -Dscript.extention=.bat

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


person oHo    schedule 11.02.2013    source источник


Ответы (2)


Наконец, я смешал идеи => <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>

Затем я использую переменную для завершения имени файла сценария:

<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>


⚠ Как заметил Максим для maven 3.5.4, переместите раздел <configuration> вверх, как показано ниже. :

<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>

Я переместил рабочий каталог из pom.xml в сценарий оболочки. Чтобы упростить обслуживание, общие вещи перемещены в этот сценарий оболочки. Поэтому пакетный файл использует этот сценарий оболочки:

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
person oHo    schedule 11.02.2013
comment
проблема с вашей конфигурацией: переместите раздел конфигурации из тега выполнения в объявление корневого плагина. т.е. //plugin/executions/execution/configuration -> //plugin/configuration иначе я получаю сообщение об ошибке: The parameter 'executable' is missing or invalid в последней версии maven 3.5.4 - person Maksim Kostromin; 29.06.2018

Пример запуска скрипта sh.

Это просто делает chmod для скрипта sh. Имейте в виду, что если у вас есть скрипт sh, вам обязательно нужно выполнить chmod перед выполнением других операций, таких как запуск фактического скрипта, поэтому, взяв это в качестве примера, вы можете выполнить первый <execution>, как показано ниже, и добавить еще один <execution> для запуска вашего скрипта. .

Для командного файла у вас может быть только один <execution> для запуска вашего скрипта.

        <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>

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

person Andrei Sfat    schedule 11.02.2013
comment
Хм... мой pom.xml имеет длину 120 строк: я также называю другие скрипты make clean. Я боюсь, что <profile> почти удвоит мой pom.xml размер, не так ли... :-( - person oHo; 11.02.2013
comment
:) У меня есть pom.xml длиной 1k строк, так что не беспокойтесь об этом. - person Andrei Sfat; 11.02.2013
comment
1к строк :o Спасибо за помощь. Наконец я смешал все идеи. Я опубликую свое окончательное решение в другом ответе. Но я подтверждаю ваш ответ. Ваше здоровье - person oHo; 11.02.2013