#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 .