将资源文件放在JSF应用程序中的最佳位置

时间:2011-10-03 18:57:45

标签: jsf maven jsf-2

在常规的Java应用程序中,如果我有一个静态资源文件,我习惯使用ClassLoader来获取它。但是我发现这是JSF Web应用程序中的一个问题。

首先,maven不会将资源文件从 src 复制到目标,然后将其打包到 war 文件中,除非你在 pom.xml 中专门添加资源标记。这是一个痛苦,但更糟糕的是,似乎标签阻止了 generated-sources 阶段在JPA MetaModel中复制 - 破坏了包。

所以看起来这样的资源文件可能应该去其他地方,比如 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元模型会被删除而不会再次创建,从而导致编译时错误。

有趣的是,Netbeans 7.0 IDE 确实以某种方式生成了Metamodel。但它并未存储在目标目录中,而是存储在〜/ .netbeans 下的缓存目录中。

更新#2(另一个问题):

我注意到有一种方法:

FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream(String ..);

这是我应该使用的吗?但是我不希望资源文件暴露给外部世界 - 我宁愿将其隐藏在 WEB-INF 中。

1 个答案:

答案 0 :(得分:0)

要关闭此问题以便其他任何有相同问题的人,我会发布解决方法。基本上这是有效的:

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

我选择将 words.txt 文件放在 / resources 目录中,但我可以将其移到 / WEB-INF <中的某个位置/ strong>即可。由于Maven插件将资源目录不变地复制到目标,因此没有新的配置。