Плагин exec maven: код выхода

У меня есть следующий плагин для запуска скрипта .sh:

<plugin>
  <artifactId>exec-maven-plugin</artifactId>
  <groupId>org.codehaus.mojo</groupId>
  <executions>
    <execution>
      <id>deploy-bundles</id>
      <phase>install</phase>
      <goals>
        <goal>exec</goal>
      </goals>
      <configuration>
        <executable>${basedir}/deploy.sh</executable>
        <successCodes>
            <successCode>0</successCode> <-- Not working
        </successCodes>
      </configuration>
    </execution>
  </executions>
</plugin>

который копирует некоторые папки и файлы в определенные места. Оно работает. Однако на всякий случай я хочу иметь механизм отказа при ошибке. У меня уже есть команда set -e в моем сценарии .sh, но я тоже хочу решение maven. Я слышал, что существует тег под названием successCodes. попробуй включить. Но пока не повезло. Может ли кто-нибудь указать правильный способ сделать это?

Редактировать: Мой скрипт .sh выглядит так:

cp ../template/config.properties $component/conf
cp ../../runtime/group1/group1.mw/conf/log4j.xml $component/conf
# if the component is planning, create an additional folder called plans
if [[ $component == *".planning"* ]] 
then
mkdir -p $component/plans
    # copy all the plans here
    cp ../../mission.planning/plans/* $component/plans
fi  

где ожидается сбой в случае отсутствия этих папок/файлов. Итак, в качестве теста я вручную меняю пути выше и ожидаю, что это не удастся. Он не выполняет процесс выполнения и сообщает мне об ошибке (поскольку у меня есть команда set -e в сценарии .sh), однако maven сообщает об «успехе».


person Schütze    schedule 03.08.2016    source источник
comment
Я запутался. Вы говорите, что у вас есть set -e в вашем сценарии оболочки, затем вы включаете сценарий оболочки, но в нем нет set -e. Вы пропустили несколько строк из сценария оболочки, который вы включили?   -  person rjmunro    schedule 01.10.2020


Ответы (1)


Это не проблема с плагином Exec Maven, а проблема с обработкой кодов выхода в сценарии оболочки.

Параметр successCodes полезен в ситуации, когда исполняемый файл имеет код выхода, отличный от 0 для "успешного выполнения":

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

Поведение по умолчанию — считать код выхода 0 успешным выполнением, а все остальные — неудачными, и в этом случае плагин не сможет выполнить сборку.

В вашем сценарии оболочки у вас есть несколько команд, каждая из которых имеет свой собственный код выхода. Без какой-либо лишней обработки код выхода самого скрипта в целом является кодом выхода последней команды. Поэтому, даже если одна из команд не удалась (поэтому ее код выхода не равен нулю), успешная команда после этого сбросит код выхода скрипта на 0. Вы можете проверить это, вызвав скрипт в командной строке вне Maven, и эхо переменная $?, которая содержит код выхода.

Таким образом, вам необходимо проверить код выхода каждой вызванной команды, которая может завершиться ошибкой внутри вашей оболочки. (Вы также можете использовать немного арифметических действий для накопления каждого кода выхода.)

person Tunaki    schedule 03.08.2016