【问题标题】:What is the most common standard in a Java web app for including resources on the classpath?Java Web 应用程序中用于在类路径中包含资源的最常见标准是什么?
【发布时间】:2011-05-16 18:02:59
【问题描述】:

我正在使用 Spring 的国际化,并且属性文件需要位于类路径中。我还有一些需要在类路径中的 XML 文件。是否可以将这些资源包含在子目录的“src”中,然后让它们构建到类路径中,还是在启动期间将不同的文件夹添加到类路径中更好?我正在使用 Ant,但从外观上看,这是 Maven 采用的方法(一切都在 src 或 test 下)。我正在寻找最广泛接受的行业标准或更好的替代方案。谢谢!

【问题讨论】:

    标签: java resources classpath


    【解决方案1】:

    是否可以只将这些资源包含在子目录的“src”中,然后让它们构建到类路径中

    取决于相关资源的唯一用途。使用这种方法,对此类资源文件的任何微小编辑都需要完全重建、重新部署和重新启动。

    这对于一次性读取的启动和应用程序范围的配置文件(如 web.xmlapplication.xml 及其配偶)不一定有害,因为这通常会影响(或受其影响)需要完全重建的 Java 源代码的更改无论如何/重新部署/等。

    但是对于像 i18n 属性文件和特定于环境的配置文件这样的运行时文件(将/可以由服务器管理员或客户等非开发人员管理),将其打包在 web 应用程序中是没有用的。这需要了解如何在编辑后重建 webapp。您希望将其外部化,以便只需要重新启动 web 应用程序来反映配置中的更改,或者甚至根本不需要,例如 ResourceBundle,它只会自动重新加载。

    我自己通常将这些文件放在 servletcontainer 的固定路径中,并将该路径添加到 servletcontainer 的运行时类路径中。例如 Tomcat,它可以配置为 /conf/catalina.properties 中的 shared.loader 属性。例如

    shared.loader=/var/webapp
    

    然后,此文件夹中的任何内容都会被放入 servletcontainer(和 webapp)的运行时类路径中。

    【讨论】:

    • 在开源应用程序的情况下(我的目前还没有)这不是假设每个人都将使用同一个 servlet 容器吗?
    • 我不明白这个问题的重点。这个问题背后的理由/推理是什么?我并不是要暗示它只能在 Tomcat 左右。
    • 我的意思是大多数人更喜欢通过简单地将 WAR 扔到工作目录中来启动并运行应用程序,就像 Tomcat 一样,让它解压并运行。这就是为什么我在问题中询问在运行时必须配置额外的类路径是否合适。在这种情况下,您必须告诉运行您的应用程序的每个人必须配置此新路径。
    【解决方案2】:

    您放在 WEB-INF/classes 目录中的任何内容都会自动在 CLASSPATH 中。

    我通常只将 .java 文件放在 /src/test 目录下。我放在其他地方的任何资源都必须以 WEB-INF/classes 结尾。创建 WAR 文件时,我的 IDE (IntelliJ) 或 Ant 将它们放在那里。

    我会建议遵循 Spring 示例并将资源放在他们应该做的地方。

    例如,如果您使用 Velocity 作为模板引擎,您会看到 Spring 配置允许您将它们放在 /WEB-INF/vm_views 下。

    属性放在 WEB-INF/classes 中。

    查看 Spring 文档以获取示例。

    【讨论】:

      猜你喜欢
      • 2018-04-28
      • 1970-01-01
      • 2012-08-15
      • 2021-09-12
      • 1970-01-01
      • 2011-01-19
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多