在常规的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 中。
答案 0 :(得分:0)
要关闭此问题以便其他任何有相同问题的人,我会发布解决方法。基本上这是有效的:
FacesContext fc = FacesContext.getCurrentInstance();
InputStream ris = fc.getExternalContext().getResourceAsStream("/resources/misc/words.txt");
我选择将 words.txt 文件放在 / resources 目录中,但我可以将其移到 / WEB-INF <中的某个位置/ strong>即可。由于Maven插件将资源目录不变地复制到目标,因此没有新的配置。