Я хочу выполнять команды оболочки из Maven pom.xml


105

Я хочу выполнять команды оболочки Linux с помощью Maven. Вот что я пробовал:

<plugin>  
  <groupId>org.codehaus.mojo</groupId> 
  <artifactId>exec-maven-plugin</artifactId> 
  <version>1.1.1</version> 
  <executions>
    <execution>
      <goals>
        <goal>exec</goal> 
      </goals>
    </execution>
  </executions>
  <configuration>
    <executable>hostname</executable> 
  </configuration>
</plugin>

пожалуйста, очистите свой вопрос и отформатируйте pom.xml в своем вопросе. Это не читается.
zengr

12
Я не хочу показаться грубым, но вам действительно нужно научиться задавать вопросы, мы не экстрасенсы. Что ты сделал? Что ты получил? Каков ожидаемый результат?
Паскаль Тивент

Ответы:


148

Вот что у меня работало:

<plugin>
  <artifactId>exec-maven-plugin</artifactId>
  <groupId>org.codehaus.mojo</groupId>
  <executions>
    <execution><!-- Run our version calculation script -->
      <id>Version Calculation</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>exec</goal>
      </goals>
      <configuration>
        <executable>${basedir}/scripts/calculate-version.sh</executable>
      </configuration>
    </execution>
  </executions>
</plugin>


11
Я хотел бы добавить, что это не работает (по крайней мере) с версией плагина 1.5.0, поскольку оно <configuration />должно следовать после, <executions />а не помещаться в него. Мне потребовалось много времени, чтобы найти эту простую синтаксическую ошибку. Вывод ошибок Maven действительно не так полезен.
joergl

1
Какую фазу или цель нам нужно предоставить, если мы хотим запустить скрипт после фазы развертывания?
Люси

3
Фазы Maven перечислены здесь: maven.apache.org/guides/introduction/…
Эд Рэндалл,

2
Использование <workingDirectory>${basedir}/scripts/</workingDirectory>в блоке конфигурации, вместо того, <executable>чтобы указывать полный путь, также может быть хорошей идеей
акн

35

Проблема здесь в том, что я не знаю, чего ожидать . При ваших текущих настройках вызов плагина из командной строки будет работать:

$ mvn exec: exec
[ИНФОРМАЦИЯ] Поиск проектов ...
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
[INFO] Корпус Q3491937
[ИНФОРМАЦИЯ] сегмент задачи: [exec: exec]
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
[ИНФОРМАЦИЯ] [exec: exec {выполнение: default-cli}]
[INFO] ноутбук
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
[ИНФОРМАЦИЯ] УСПЕШНО СОЗДАТЬ
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
...

Используется глобал configuration, hostnameкоманда выполняется ( laptopэто мое имя хоста). Другими словами, плагин работает должным образом.

Теперь, если вы хотите, чтобы плагин выполнялся как часть сборки , вы должны привязать цель к определенной фазе. Например, чтобы привязать его compile:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.1.1</version>
    <executions>
      <execution>
        <id>some-execution</id>
        <phase>compile</phase>
        <goals>
          <goal>exec</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <executable>hostname</executable>
    </configuration>
  </plugin>

А потом:

$ mvn компилировать
[ИНФОРМАЦИЯ] Поиск проектов ...
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
[INFO] Корпус Q3491937
[ИНФОРМАЦИЯ] сегмент задачи: [компиляция]
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
[ИНФОРМАЦИЯ] [ресурсы: ресурсы {выполнение: ресурсы по умолчанию}]
[ИНФОРМАЦИЯ] Использование кодировки UTF-8 для копирования отфильтрованных ресурсов.
[ИНФОРМАЦИЯ] пропустить несуществующий каталог ресурсов / home / pascal / Projects / Q3491937 / src / main / resources
[ИНФОРМАЦИЯ] [компилятор: компиляция {выполнение: компиляция по умолчанию}]
[INFO] Компилировать нечего - все классы обновлены
[ИНФОРМАЦИЯ] [exec: exec {выполнение: какое-то исполнение}]
[INFO] ноутбук
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
[ИНФОРМАЦИЯ] УСПЕШНО СОЗДАТЬ
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
...

Обратите внимание, что вы можете указать configurationвнутри execution.


[ERROR] BUILD ERROR [INFO] ------------------------------------------ ------------------------------ [ИНФОРМАЦИЯ] Один или несколько обязательных параметров плагина недействительны / отсутствуют для 'exec: exec' [ 0] Внутри определения подключаемого модуля «exec-maven-plugin» укажите следующее: <configuration> ... <executable> VALUE </executable> </configuration> -OR- в командной строке укажите: '-Dexec. исполняемый файл = VALUE 'Я получаю эту ошибку сейчас.
НарешКумар

2
@ gnash-85: Я до сих пор не понимаю, что ты делаешь. Я использовал именно тот фрагмент, который вы предоставили, и не имел никаких проблем, как показано выше. Обновите свой вопрос, чтобы показать, как вы вызываете maven (и какова ваша текущая конфигурация, если вы что-то изменили).
Паскаль Тивент

Я поместил тот же код в дочерний модуль. И я пытаюсь выполнить mvn exec: exec из родительского pom.xml. И я получаю эту ошибку. Но когда я выполняю его индивидуально, он работает.
NareshKumar

5
@ gnash-85: Это нормально. Когда вы вызываете mvn exec:execродительский объект, mvn запускает его во всех проектах многомодульной сборки, включая родительский. Но родительский pom не имеет конфигурации для плагина, который ожидает, что executableбудет определен, отсюда и сообщение об ошибке.
Паскаль Тивент

2
Добавление к этому обсуждению. Если вы укажете свой configurationвнутри executionблока, он будет работать, если запущен как часть group ( mvn install), но specify the following: <configuration>выдаст ошибку, если запустить напрямую с mvn exec:exec.
roo2 04

19

Решено. Проблема в том, что исполняемый файл в Linux работает по-другому. Если вы хотите запустить файл .sh, вы должны написать, как показано ниже. Напишите в pom.xml

    <plugin>
        <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
        <groupId>org.codehaus.mojo</groupId>
        <executions>
            <execution><!-- Run our version calculation script -->
                <id>Renaming build artifacts</id>
                <phase>package</phase>
                <goals>
                    <goal>exec</goal>
                </goals>
                <configuration>
                    <executable>bash</executable>
            <commandlineArgs>handleResultJars.sh</commandlineArgs>
                </configuration>
            </execution>
        </executions>
    </plugin>

2
Спасибо! Для меня как пользователя Windows, предпочитающего сценарии оболочки, это было ключевым моментом!
Ruik

6

2 варианта:

  1. Вы хотите выполнить команду из maven без привязки к какой-либо фазе, вы просто набираете команду, и maven запускает ее , вы просто хотите, чтобы maven что-то запускало, вам все равно, находимся ли мы в compile / package / ... Давайте скажем, я хочу работать npm startс maven, вы можете добиться этого следующим образом:

mvn exec:exec -Pstart-node

Для этого вам понадобится приведенный ниже раздел maven

  <profiles>
    <profile>
      <id>start-node</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.3.2</version>
            <executions>
              <execution>
                <goals>
                  <goal>exec</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <executable>npm</executable>
              <arguments><argument>start</argument></arguments>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>

  </profiles>
  1. Вы хотите запустить произвольную команду из maven, пока вы находитесь на определенной стадии , например, когда я нахожусь на стадии установки, которую я хочу запустить, npm installвы можете сделать это с помощью:

mvn install

И для этого вам понадобится следующий раздел:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.3.2</version>
    <executions>

      <execution>
        <id>npm install (initialize)</id>
        <goals>
          <goal>exec</goal>
        </goals>
        <phase>initialize</phase>
        <configuration>
          <executable>npm</executable>
          <arguments>
            <argument>install</argument>
          </arguments>
        </configuration>
      </execution>

1

Спасибо! Томер Бен Дэвид. мне это помогло. поскольку я выполняю установку pip в демонстрационной папке, как вы упомянули, npm install

<groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.3.2</version>
            <executions>
              <execution>
                <goals>
                  <goal>exec</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <executable>pip</executable>
              <arguments><argument>install</argument></arguments>                            
             <workingDirectory>${project.build.directory}/Demo</workingDirectory>
            </configuration>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.