Лучшее место для размещения файла ресурсов в приложении JSF

#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 копирует каталог ресурсов без изменений в целевой, то там нет ничего нового для настройки.