null

Wildfly и JSF — изменение xhtml страниц без редеплоя

При разработке 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.

 

Спасибо за внимание.