При разработке JSF приложений зачастую приходится менять различные статические файлы (в основном xhtml страницы и css файлы), не меняя исходного Java-кода. В таком случае хотелось бы избежать процесса компиляции, сборки приложения и деплоя его на сервер приложений. Раньше, когда я пользовался сервером приложений Glassfish, этот процесс был простым, так как он имеет интуитивно понятную файловую структуру — каждый домен содержит каталог applications, в котором есть каталог под каждое из развернутых приложений (имя каталога будет совпадать с именем приложения).
ivan@Acer:~/glassfish3/glassfish/domains/domain2
$ ls applications/
__internal prime-1.0
ivan@Acer:~/glassfish3/glassfish/domains/domain2
$ ls applications/prime-1.0/
main.xhtml META-INF WEB-INF
Если изменить содержимое файла applications/prime-1.0/main.xhtml, то все изменения будут видны и без редеплоя.
Через некоторое время мне пришлось столкнуться с той же задачей на сервере приложений Wldfly, запущенном в standalone режиме. Попробуем найти что-то похожее вручную.
ivan@Acer:~/programs/wildfly-10.1.0.Final
$ ls
appclient bin copyright.txt docs domain jboss-modules.jar LICENSE.txt modules portfolio-full.log portfolio.log README.txt standalone welcome-content
ivan@Acer:~/programs/wildfly-10.1.0.Final
$ ls standalone/
configuration data deployments lib log tmp
Учитывая то, что каталог standalone/deployments — это каталог для автодеплоя, то очевидным местом расположения файлов уже развернутых приложений оказывается tmp.
ivan@Acer:~/programs/wildfly-10.1.0.Final
$ ls -l standalone/tmp/
total 20
drwx------ 2 ivan ivan 4096 дек 28 21:11 auth
drwxrwxr-x 2 ivan ivan 4096 янв 16 13:29 prime-1.0.war
-rw-rw-r-- 1 ivan ivan 21 янв 16 13:28 startup-marker
drwxrwxr-x 4 ivan ivan 4096 янв 16 13:28 vfs
Хм... Возможно, стоит как-то автоматизировать процесс поиска. Попробуем найти какой-нибудь ключевой файл — например, main.xhtml
ivan@Acer:~/programs/wildfly-10.1.0.Final
$ find standalone/tmp/ -name 'main.xhtml'
standalone/tmp/vfs/temp/temp13900ef5ad4cbd55/content-1ca1c282b46435b/main.xhtml
Названия каталогов намекают, что они сгенерированы автоматически. Проведем эксперимент — перезапустим сервер.
ivan@Acer:~/programs/wildfly-10.1.0.Final
$ find standalone/tmp/ -name 'main.xhtml'
standalone/tmp/vfs/temp/temp7673e1a2b5bb5bb0/content-a7a57d759726b859/main.xhtml
Итак, названия изменились. При этом непосредственно в standalone/tmp/vfs/temp находится лишь один каталог для текущей сессии Wildfly. Так как хотелось бы автоматизировать процесс копирования файлов, то нельзя полагаться на эти имена каталогов, а вот на имя какого-нибудь файла можно. Из этого предположения получился такой скрипт, расположенный в корне maven-проекта и использующий Wildfly, местоположение которого определяется переменной JBOSS_HOME.
#!/usr/bin/env bash
JBOSS_TEMP=$(ls ${JBOSS_HOME}/standalone/tmp/vfs/temp)
JBOSS_TEMP=${JBOSS_HOME}/standalone/tmp/vfs/temp/${JBOSS_TEMP}/*
APP_ROOT_PATH=''
for f in ${JBOSS_TEMP};
do
ls ${f}/main.xhtml 2> /dev/null > /dev/null
if [[ $? == "0" ]]; then
APP_ROOT_PATH=${f}
cp -R src/main/webapp/* ${APP_ROOT_PATH}
break;
fi
done
Добавив какие-нибудь команды в тело if'a можно копировать еще какие-нибудь файлы кроме xhtml страниц, находящихся в проекте в каталоге src/main/webapp.
Спасибо за внимание.