最近,我将核心servlet应用程序的核心功能分成了一个jar文件。这个jar文件现在部署在tomcat的lib文件夹中,应用程序(即servlets,jsps,properties files..etc)作为war文件独立部署。
jar文件需要特定的属性文件。我将这些属性文件放在war文件中的“src”文件夹下(即类层次结构的顶部)。
过去当一切都在同一个项目中并部署在一个war文件中时。相关类可以访问属性文件。现在,当这些类部署在jar中时,他们无法看到war文件中的属性文件(即已部署的Web应用程序)。
我在这里可以缺少什么? 我如何加载我的proeprties文件的示例:
properties.load(getClass().getResourceAsStream("/appconfig.properties"));
感谢您的时间。
答案 0 :(得分:9)
你不应该通过班级自己的类加载器来获得它。由于该类现在由Tomcat管理,它只知道Tomcat的内部资源,而不是关于特定于webapp的资源。你应该通过当前线程的上下文类加载器来获取它。该类加载器了解所有专用于当前webapp的资源。
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("appconfig.properties"));
无论如何,表示全局应用程序配置的此类属性文件的正确位置不在WAR文件中。您应该将属性文件放在Tomcat和WAR文件之外的固定路径上,然后将该固定路径添加到Tomcat shared.loader
的{{1}}属性中,以使其成为类路径的一部分。这允许您自由编辑配置文件,而无需重建/重新部署整个WAR。请注意,仍然需要使用上下文类加载器来加载它。
答案 1 :(得分:1)
是的,这是行不通的,因为tomcat lib文件夹中的jar由不同的类加载器加载,而类加载器对你的webapp类一无所知。换句话说,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")));