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

С этой ситуацией я сталкиваюсь: на данный момент у меня есть два проекта 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 по умолчанию (v. 3.0.2). Чтобы создать и развернуть сайт в Eclipse, я щелкнул правой кнопкой мыши по родительскому проекту> Запуск от имени> Сборка Maven... > 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 ответ

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

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

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

Другие вопросы по тегам