【发布时间】:2011-11-30 03:54:21
【问题描述】:
在常规的 java 应用程序中,如果我有一个静态资源文件,我习惯于使用 ClassLoader 来获取它。但是我发现这是 JSF Web 应用程序中的一个问题。
首先,maven不会将资源文件从src复制到target再打包到war文件中,除非你专门在 pom.xml 中添加 resource 标签。这很痛苦,但更糟糕的是,标签似乎阻止了 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确实以某种方式生成了元模型。但它并不存储在 target 目录中,而是隐藏在 ~/.netbeans 下的 cache 目录中。
更新 #2(另一个问题):
我注意到有一个方法:
FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream(String ..);
这是我应该改用的吗?但是我不希望资源文件暴露给外界——我宁愿将它隐藏在 WEB-INF 中。
【问题讨论】:
-
你能改写一下直接问一个问题吗?尝试阅读您的问题两次后,我不知道您在说什么。
-
关于更新 2:您可以自己将其放入
/WEB-INF并在ExternalContext#getResourceAsStream()路径中进行引用。但是,我更喜欢将它放在类路径中,从而解决 Maven 问题。 -
我也更喜欢这样。 Maven 对我来说非常不透明,我希望我能找到合适的文档。