Лучшее место для размещения файла ресурсов в приложении JSF - PullRequest
0 голосов
/ 03 октября 2011

В обычном 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 .

1 Ответ

0 голосов
/ 15 октября 2011

Чтобы закрыть этот вопрос для всех, у кого есть такая же проблема, я опубликую, как я решил эту проблему. В основном это работает:

    FacesContext fc = FacesContext.getCurrentInstance();
    InputStream ris = fc.getExternalContext().getResourceAsStream("/resources/misc/words.txt");

Я решил поместить файл words.txt в каталог / resources , но я мог бы переместить его куда-нибудь в / WEB-INF, Поскольку подключаемый модуль Maven копирует каталог ресурсов в целевую папку, то ничего нового для настройки там нет.

...