#jsf #maven #jsf-2
#jsf #maven #jsf-2
Вопрос:
В обычном приложении Java, если у меня есть статический файл ресурсов, я привык использовать ClassLoader для его получения. Однако я обнаружил, что это проблема в веб-приложении JSF.
Прежде всего, maven не будет копировать файл ресурсов из src в target, а затем упаковывать его в файл war, если вы специально не добавите тег ресурса в pom.xml . Это боль, но еще хуже то, что кажется, что tag останавливает копирование фазы сгенерированных источников в метамодели JPA — разрыв пакета.
Таким образом, кажется, что такой файл ресурсов, вероятно, должен находиться где-то в другом месте, например, где-то в разделе WEB-INF. Может кто-нибудь указать мне, какова обычная практика для этого? Я все еще использую метод getResourceAsStream() загрузчика классов или что-то еще?
ОБНОВЛЕНИЕ (некоторые пояснения):
То, что я использовал, было в pom.xml файл:
<resources>
<resource>
<directory>src/main/java/com/myapp/app/resource</directory>
<targetPath>com/myapp/app/resource</targetPath>
</resource>
</resources>
Если вы не введете это, файлы не будут включены в цель. Затем, чтобы использовать файл, я делаю это:
InputStream ris = getClass().getResourceAsStream("/com/myapp/app/resource/words.txt");
Это работает — я получаю данные из words.txt точно так же, как я поступил бы, если бы был настольным приложением java. Проблема в том, что, когда я помещаю это в pom.xml , в следующий раз, когда я выполняю операцию «очистки и сборки», метамодель JPA удаляется и не создается снова, что приводит к ошибкам во время компиляции.
Самое смешное, что среда IDE Netbeans 7.0 каким-то образом генерирует метамодель. Но он не хранится в целевом каталоге, он хранится в каталоге кэша под ~/.netbeans .
ОБНОВЛЕНИЕ # 2 (еще один вопрос):
Я заметил, что есть метод:
FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream(String ..);
Это то, что я должен использовать вместо этого? Однако я не хочу, чтобы файл ресурсов был доступен внешнему миру — я бы предпочел, чтобы он был скрыт в WEB-INF.
Комментарии:
1. Не могли бы вы перефразировать и задать прямой вопрос? Я понятия не имею, что вы говорите, после попытки дважды прочитать ваш вопрос.
2. Что касается обновления 2: вы можете просто поместить его в
/WEB-INF
себя и ссылаться как таковой вExternalContext#getResourceAsStream()
path. Однако я бы предпочел поместить его в classpath и, таким образом, устранить проблему Maven.3. Я бы тоже предпочел это. Maven довольно непрозрачен для меня, я хотел бы найти достойную документацию по нему.
Ответ №1:
Чтобы закрыть этот вопрос в интересах всех, у кого есть такая же проблема, я опубликую, как я это решил. В основном это работает:
FacesContext fc = FacesContext.getCurrentInstance();
InputStream ris = fc.getExternalContext().getResourceAsStream("/resources/misc/words.txt");
Я решил разместить words.txt файл в каталоге /resources, но я мог бы переместить его куда-нибудь внутри /WEB-INF . Поскольку подключаемый модуль Maven копирует каталог ресурсов без изменений в целевой, то там нет ничего нового для настройки.