2

最近,我将核心 servlets 应用程序的核心功能分离到一个 jar 文件中。这个 jar 文件现在部署在 tomcat 的 lib 文件夹中,应用程序(即 servlet、jsps、属性文件..等)作为 war 文件独立部署。

jar 文件需要特定的属性文件。我将这些属性文件放在war文件中的“src”文件夹下(即在类层次结构的顶部)。

过去,当一切都在同一个项目中并部署在一个 war 文件中时。相关类可以访问属性文件。现在,当这些类部署在 jar 中时,它们无法看到位于 war 文件(即部署的 Web 应用程序)中的属性文件。

我在这里能错过什么?我如何加载我的 proeprties 文件的示例:

properties.load(getClass().getResourceAsStream("/appconfig.properties"));

感谢您的时间。

4

2 回答 2

9

你不应该通过类自己的类加载器来获取它。由于这个类现在由 Tomcat 管理,它只知道 Tomcat 的内部资源,而不知道 webapp 特定的资源。您应该通过当前线程的上下文类加载器来获取它。该类加载器知道专用于当前 web 应用程序的所有资源。

properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("appconfig.properties"));

无论如何,表示全局应用程序配置的此类属性文件的正确位置不会在 WAR 文件中。您应该将属性文件放在 Tomcat 和 WAR 文件之外的固定路径上,然后将该固定路径添加到shared.loaderTomcat 的属性中/conf/catalina.properties,使其成为类路径的一部分。这允许您自由编辑配置文件,而无需重建/重新部署整个 WAR。请注意,您仍然需要使用上下文类加载器来加载它。

于 2011-08-16T16:16:26.973 回答
1

是的,这是行不通的,因为 tomcat lib 文件夹中的 jar 是由不同的类加载器加载的,该类加载器对您的 web 应用程序的类一无所知。换句话说,tomcat lib 是 webapp 类加载器的父类加载器(每个 webapp 都创建一个)。

如果你想让它工作,你可以将属性文件放在外部位置,并通过绝对文件路径让 tomcat lib 中的 jar 知道它,或者将 jar 放回 webapp 的 lib 中。

这是来自 Tomcat 站点的一些参考资料。

http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html

通常,环境变量用于标识 $CATALINA_HOME,然后将其作为相对文件路径的前缀,以避免对绝对路径进行硬编码。

String catalinaHome = System.getProperty("CATALINA_HOME");
properties.load(new FileInputStream(new File(catalinaHome + "/path/to/appconfig.properties")));
于 2011-08-16T16:09:31.137 回答