В обычном Java-приложении, если у меня есть статический файл ресурсов, я привык использовать ClassLoader для его получения. Однако я обнаружил, что это проблема в веб-приложении JSF.
Прежде всего, maven не скопирует файл ресурсов из src в target , а затем упакует его в файл war , если вы не добавите Тег resource в pom.xml . Это неприятно, но еще хуже то, что кажется, что тег останавливает фазу Генерируемые источники от копирования в метамодели 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 действительно генерирует метамодель каким-то образом. Но он не хранится в каталоге target , а скрыт в каталоге cache в каталоге ~ / .netbeans .
ОБНОВЛЕНИЕ № 2 (другой вопрос):
Я заметил, что есть метод:
FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream(String ..);
Это то, что я должен использовать вместо этого? Однако я не хочу, чтобы файл ресурсов был открыт для внешнего мира - я бы предпочел, чтобы он был скрыт в WEB-INF .