Выполнение скрипта из Maven 3 с использованием плагина exec — блокируется

#bash #shell #maven #maven-3 #maven-site-plugin

#bash #оболочка #maven #maven-3 #maven-site-plugin

Вопрос:

Это ситуация, с которой я сталкиваюсь: на данный момент у меня есть два проекта Maven, один из которых ничего не делает, кроме описания зависимостей, репозиториев и т. Д. (родительский) и дочерний, который наследует другой pom.xml . В будущем будет создано больше модулей, следуя той же модели, что и дочерний элемент.

Мы решили развернуть сайты проектов (созданные с помощью maven-site-plugin) в месте, доступном в данный момент только через sftp. И я обнаружил, что невозможно определить местоположение сайта <distributionManagement> , потому что я не смог интегрировать протокол sftp (я пытался использовать wagon-ssh-external).

В результате я создал скрипт, который подключается к удаленному компьютеру и загружает содержимое локальной папки, в которой развернут наш сайт, на этапе развертывания сайта:

 echo "Uploading the site.."
lftp -u ${username},${password} sftp://${host} <<EOF
mirror -R --delete-first $sitedir $remotedir
echo "Exiting from lftp.."
bye
EOF
echo "Terminating script execution.."
  

Это отлично работает для родительского сайта, загружая сайт сразу после его локального создания, но когда дочерний элемент попадает в конец скрипта, он не завершается должным образом, печатается Terminating script execution.. и остается там.

Я использую Eclipse, последнюю версию (3.7) с плагином Maven по умолчанию (версия 3.0.2). Чтобы сгенерировать и развернуть сайт в Eclipse, я щелкнул правой кнопкой мыши родительский проект> Запустить как> Maven build … > parent clean site-deploy .

Это части родительского pom.xml :

 <distributionManagement>
 <!-- Generate the site locally, then it'll be uploaded to the server -->
 <!-- Children will append their artifact ID to the base url  -->
 <site>
  <id>project-name</id>
  <name>Project Name</name>
  <url>file://${env.HOME}/testsite/</url>
 </site>
</distributionManagement>
...
<build> 
<pluginManagement>
 <plugins>
  <plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>exec-maven-plugin</artifactId>
   <version>1.2.1</version>
  </plugin>
 </plugins>
</pluginManagement>
<plugins>
 <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-site-plugin</artifactId>
  <version>3.0</version>
  <configuration>
    ...
 </plugin>
 <plugin>
  <groupId>org.codehaus.mojo</groupId>          
  <artifactId>exec-maven-plugin</artifactId>
  <inherited>false</inherited>
  <executions>
   <execution>
    <id>sh</id>
    <phase>site-deploy</phase>
    <goals>
     <goal>exec</goal>
    </goals>
    <configuration>
     <executable>sh</executable>
     <arguments>
      <argument>publish-site.sh</argument>
      <argument>${localsitedir}</argument>
      ...
     </arguments>
    </configuration>
   </execution>
  </executions>
 </plugin>
</plugins>
</build>
  

И от дочернего элемента:

 <build>
 <plugin>
  <groupId>org.codehaus.mojo</groupId>          
  <artifactId>exec-maven-plugin</artifactId>
  <executions>
   <execution>
    <id>sh</id>
    <phase>site-deploy</phase>          
    <goals>
     <goal>exec</goal>
    </goals>
    <configuration>
     <executable>sh</executable>
     <arguments>
      <argument>../parent/publish-site.sh</argument>
      <argument>${localsitedir}/child</argument>
      ...
     </arguments>
    </configuration>
   </execution>
  </executions>
 </plugin>
</build>
  

Я пробовал разные способы настройки плагина exec (без использования pluginManagement , наследования родительской конфигурации плагина и только перезаписи части аргументов и т. Д.), И он всегда блокируется при завершении скрипта и не завершает выполнение.

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

Комментарии:

1. Это может показаться глупым, но вы пытались добавить оператор exit 0 в конце publish-site.sh ?

Ответ №1:

Мой ответ основан на множестве предположений… Я столкнулся с аналогичной проблемой, связанной с командой SSH, которая не завершается, и причина была:

Возможно, ‘lftp’ запускает процесс, который не завершается, и, возможно (вероятно), плагин maven-exec использует stdout и stderr для печати всех соответствующих сообщений перед выходом. Если не все авторы закрыты, это застревает.

На всякий случай попробуйте перенаправить вывод ‘lftp’ в /dev/null .