【发布时间】:2011-05-16 18:02:59
【问题描述】:
我正在使用 Spring 的国际化,并且属性文件需要位于类路径中。我还有一些需要在类路径中的 XML 文件。是否可以将这些资源包含在子目录的“src”中,然后让它们构建到类路径中,还是在启动期间将不同的文件夹添加到类路径中更好?我正在使用 Ant,但从外观上看,这是 Maven 采用的方法(一切都在 src 或 test 下)。我正在寻找最广泛接受的行业标准或更好的替代方案。谢谢!
【问题讨论】:
我正在使用 Spring 的国际化,并且属性文件需要位于类路径中。我还有一些需要在类路径中的 XML 文件。是否可以将这些资源包含在子目录的“src”中,然后让它们构建到类路径中,还是在启动期间将不同的文件夹添加到类路径中更好?我正在使用 Ant,但从外观上看,这是 Maven 采用的方法(一切都在 src 或 test 下)。我正在寻找最广泛接受的行业标准或更好的替代方案。谢谢!
【问题讨论】:
是否可以只将这些资源包含在子目录的“src”中,然后让它们构建到类路径中
取决于相关资源的唯一用途。使用这种方法,对此类资源文件的任何微小编辑都需要完全重建、重新部署和重新启动。
这对于一次性读取的启动和应用程序范围的配置文件(如 web.xml 和 application.xml 及其配偶)不一定有害,因为这通常会影响(或受其影响)需要完全重建的 Java 源代码的更改无论如何/重新部署/等。
但是对于像 i18n 属性文件和特定于环境的配置文件这样的运行时文件(将/可以由服务器管理员或客户等非开发人员管理),将其打包在 web 应用程序中是没有用的。这需要了解如何在编辑后重建 webapp。您希望将其外部化,以便只需要重新启动 web 应用程序来反映配置中的更改,或者甚至根本不需要,例如 ResourceBundle,它只会自动重新加载。
我自己通常将这些文件放在 servletcontainer 的固定路径中,并将该路径添加到 servletcontainer 的运行时类路径中。例如 Tomcat,它可以配置为 /conf/catalina.properties 中的 shared.loader 属性。例如
shared.loader=/var/webapp
然后,此文件夹中的任何内容都会被放入 servletcontainer(和 webapp)的运行时类路径中。
【讨论】:
您放在 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 文档以获取示例。
【讨论】: