【问题标题】:Best place to put a resource file in a JSF application在 JSF 应用程序中放置资源文件的最佳位置
【发布时间】: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 对我来说非常不透明,我希望我能找到合适的文档。

标签: jsf maven jsf-2


【解决方案1】:

为了其他有同样问题的人的利益而结束这个问题,我将发布我是如何解决这个问题的。基本上这是可行的:

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

我选择将 words.txt 文件放在 /resources 目录中,但我可以将它移动到 /WEB-INF。由于 Maven 插件将资源目录原封不动地复制到目标,所以那里没有什么新的配置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多