繁体   English   中英

在tomcat的lib中的jar在我的webapp中看不到属性文件

[英]A jar in tomcat's lib can't see a properties file in my webapp

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

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

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

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

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

感谢您的时间。

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

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

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

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

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

这是来自 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")));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM