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


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
Я не хочу бути грубим, але вам справді потрібно навчитися ставити запитання, ми не психічні. Що ти робив? Що ти отримав? Який очікуваний результат?
Паскаль Thivent

Відповіді:


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 />і не розміщуватися в ній. Знаходив мене досить довго, щоб знайти цю просту синтаксичну помилку. Вихід помилки Мейвена насправді не так корисний.
joergl

1
Яку фазу чи мету нам потрібно надати, якщо ми хочемо запустити скрипт після фази розгортання ??
Люсі

3
Фази Maven перераховані тут: maven.apache.org/guides/introduction/…
Ед Рандалл

2
Використання <workingDirectory>${basedir}/scripts/</workingDirectory>в конфігураційному блоці замість того, щоб дати повний шлях до <executable>також, може бути хорошою ідеєю
akn

35

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

$ mvn exec: exec
[INFO] Сканування проектів ...
[ІНФОРМАЦІЯ] ----------------------------------------------- -------------------------
[INFO] Будівництво Q3491937
[INFO] Завдання-сегмент: [exec: exec]
[ІНФОРМАЦІЯ] ----------------------------------------------- -------------------------
[INFO] [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] Сканування проектів ...
[ІНФОРМАЦІЯ] ----------------------------------------------- -------------------------
[INFO] Будівництво Q3491937
[INFO] Завдання-сегмент: [компілювати]
[ІНФОРМАЦІЯ] ----------------------------------------------- -------------------------
[INFO] [ресурси: ресурси {виконання: default-ресурси}]
[INFO] Використання кодування "UTF-8" для копіювання відфільтрованих ресурсів.
[INFO] пропустити не існуючий ресурсДиректорій / Головна / pascal / Проекти / Q3491937 / src / основні / ресурси
[INFO] [компілятор: compile {виконання: default-compile}]
[ІНФОРМАЦІЯ] Нічого для компілювання - усі класи оновлені
[INFO] [exec: exec {виконання: деяка версія}]
[INFO] ноутбук
[ІНФОРМАЦІЯ] ----------------------------------------------- -------------------------
[ІНФОРМАЦІЯ] БУДІВЛІ УСПІШНО
[ІНФОРМАЦІЯ] ----------------------------------------------- -------------------------
...

Зауважте, що ви можете вказати configurationвсередині execution.


[ПОМИЛКА] BUILD ERROR [ІНФОРМАЦІЯ] ------------------------------------------ ------------------------------ [INFO] Один або більше необхідних параметрів плагіна недійсні / відсутні для 'exec: exec' [ 0] Всередині визначення плагіна 'exec-maven-plugin' вкажіть наступне: <configuration> ... <executable> VALUE </executable> </configuration> -OR-, у командному рядку вкажіть: '-Dexec. Executable = VALUE 'Зараз я отримую цю помилку.
NareshKumar

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

Я вклав той самий код у дочірній модуль. І я намагаюся виконати mvn exec: exec від батьківського pom.xml. І я отримую цю помилку. Але коли я індивідуально його виконую, це працює.
NareshKumar

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

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

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, який віддає перевагу скриптам оболонки, це був ключ!
Руїк

6

2 варіанти:

  1. Ви хочете виконати команду з maven без прив'язки до будь-якої фази, ви просто введіть команду і maven запускає її , ви просто хочете, щоб maven щось запустив, вам не байдуже, чи ми в компіляції / пакеті / ... Давайте скажіть, я хочу бігати 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.