我有一个中心类(RuntimeConfiguration
),它保存了我的应用程序的100
参数。这些参数取自我存储在WEB-INF
文件夹中的一个 *XML文件 *。在我的开发盒中,我硬编码了路径,但由于非常明显的原因,这不是一个高效的解决方案。
出于可移植性的原因(我的应用程序可能在 Tomcat 或 Jetty 上以及Windows或Unix下执行),我希望从我的RuntimeConfiguration
类中对该文件有一个通用的访问方式。
我知道,如果我有一个servlet,我可以使用getRealPath
,但是RuntimeConfiguration
不是在 *servlet上下文 * 中启动的。它是从一个作业(一个爬虫)中调用的,而这个作业又是通过applicationContext.xml
从quartz作业控制中启动的。现在这似乎是我的问题的核心。
有人能告诉我,如何在这个环境中获得XML的绝对路径吗?
我尝试了这种ClassLoader
方法,但得到的结果是NullPointerException
:
ClassLoader loader = this.getClass().getClassLoader();
loader.getResource("WEB-INF");
result = loader.getSystemResource(RTCF).toString();
我也试过
URL url = this.getClass().getClassLoader().getResource("WEB-INF");
也会抛出空指针异常
有没有人能给予我一个可移植的解决方案,一个可以在我的开发机器上和我的应用程序作为WAR文件部署的生产系统上工作的解决方案?
顺便说一句,该方法最多只能处理基于Windows和MacOSX/ Unix的系统。
3条答案
按热度按时间inkz8wg91#
您始终可以使用 * 保持器 * 模式:创建一个类,它有一个包含
WEB-INF
目录的真实的路径的静态字段(带有静态getter)。在根Spring应用程序上下文中创建该保持器类的一个示例,Spring为它提供一个指向ApplicationContext的指针,该指针将是一个
WebApplicationContext
,就像您在Web应用程序中一样。在init方法中,使用
WebApplicationContext
获取路径并将其存储在static字段中。由于有了Spring,您可以确保在应用程序真正启动之前调用该方法一次且仅调用一次。现在,在应用程序中的任何位置,只要您想获取路径,就可以通过调用静态getter来使用它。
此实现还允许您访问
ServletContext
,以便使用ServletContext.getResource()
编辑:
使用完整路径可能无法在不会引发战争的生产服务器上工作。* 如果servlet容器无法将给定的虚拟路径转换为真实的路径,则此方法返回null *。但在这种情况下,您始终可以使用
ServletContext.getResource()
或ServletContext.getResourceAsStream()
访问作为资源的文件z6psavjg2#
在Spring Web应用程序中,* 除非在Web应用程序上下文中将某个类声明为Bean,* 否则无法获取上下文路径 *。请在
RuntimeConfiguration
类中添加以下代码或
或
请查看服务上下文资源ServletContextResource - Spring Docs
qnzebej03#
只需将其放在类路径中,并使用“getResourcesAsStream()"加载它,或者最好将其设置为一个“.properties”文件,并以通常的方式加载它: