Linux环境下加载Spring的问题
来源:互联网 发布:gta5捏脸数据男欧美 编辑:程序博客网 时间:2024/05/15 23:52
问题描述:
最近在将项目部署到Linux环境下时,出现了加载spring.xml配置文件失败的问题,出错代码:
// Env.SPRING_PATH = /home/is/server/conf/spring.xmlspringContext = new FileSystemXmlApplicationContext(Env.SPRING_PATH);
异常信息:
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from file [/home/is/server/lib/home/is/server/conf/spring.xml]; nested exception is java.io.FileNotFoundException: home/is/server/conf/spring.xml (No such file or directory)at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344)at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252)at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127)at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93)at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:613)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:514)at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:140)at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:84)at com.is.Initializer.init(Initializer.java:36)at com.is.launcher.App.main(App.java:44)Caused by: java.io.FileNotFoundException: home/is/server/conf/spring.xml (No such file or directory)at java.io.FileInputStream.open0(Native Method)at java.io.FileInputStream.open(FileInputStream.java:195)at java.io.FileInputStream.<init>(FileInputStream.java:138)at org.springframework.core.io.FileSystemResource.getInputStream(FileSystemResource.java:114)at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:330)... 19 more
看异常,意思是说找不到 /home/is/server/lib/home/is/server/conf/spring.xml 这个文件,但实际上传入的文件路径是“/home/is/server/conf/spring.xml”,那为什么spring中该文件路径会发生变化呢?而且报错的路径是home/is/server/conf/spring.xml (注意:这里没有了“/”)。
说明:
异常消息中,前面的路径“/home/is/server/lib”实际上是当前运行程序的路径,如果切换到其它目录则会变成相应路径。
看FileSystemXmlApplicationContext类代码发现:
@Overrideprotected Resource getResourceByPath(String path) {if (path != null && path.startsWith("/")) {path = path.substring(1);}return new FileSystemResource(path);}
该方法在获取资源时,会判断是否以“/”开头,如果是,则剥掉,导致Spring后续加载文件时使用的是不带“/”的文件路径,从而导致加载失败。
Why?
来看下getResourceByPath(String)方法的注释说明:
Resource org.springframework.context.support.FileSystemXmlApplicationContext.getResourceByPath(String path)Resolve resource paths as file system paths. Note: Even if a given path starts with a slash, it will get interpreted as relative to the current VM working directory. This is consistent with the semantics in a Servlet container.
注:即使给定的路径以斜线开始,它将会被解释为相对当前VM工作目录。这与servlet容器中的语义相一致。
应该就是为了和JavaWeb开发时的环境、用法保持一致吧。
解决方法:
继承FileSystemXmlApplicationContext,重写getResourceByPath(String)方法,如下:
springContext = new FileSystemXmlApplicationContext(Env.SPRING_PATH) { @Override protected Resource getResourceByPath(String path) { if (path != null && path.startsWith("/")) { // 忽略如下代码,使其在Linux环境能正常解析文件路径 // path = path.substring(1); } return new FileSystemResource(path); } };
OK,修改后可使用指定路径加载了!
1 0
- Linux环境下加载Spring的问题
- 交叉环境下linux内核中ipp2p模块由静态加载改为动态加载的问题
- spring hibernate下的懒加载问题
- Spring+iBatis环境下的单元测试问题
- 设置自定义servlet在spring环境下的加载顺序
- linux下模块加载的一些问题
- linux 环境下开发的权限问题
- PHP5环境下,不能加载mysql的问题
- eclipse下启动服务 spring加载两次的问题
- spring Junit下的延迟加载问题(Hibernate)
- Linux环境下ELK环境搭建,以及碰到的问题
- linux环境下QT加载flash文件
- Linux环境下加载动态链接库
- Spring延迟加载的问题
- linux下静态加载一个动态库出现的问题
- 解决 linux下Firefox 不能加载 Applet 的问题
- linux下编程加载动态连接库的问题
- 如何解决Linux下库文件的加载错误问题
- 杭电OJ 1003 Max Sum
- JS学习-js内置对象
- Android,JCVideoPlayerStandard,节操,视频播放
- Idea Spring boot+Maven 打包war 发布 外部tomcat
- 如何用一台电脑绑定多个github账户
- Linux环境下加载Spring的问题
- c++多态中的虚函数
- slab机制
- SecureCRT远程连接Ubuntu,SecureCRT开发环境配置
- Linux进程间通信——使用消息队列
- Openstack Ocata安装(Dashboard)
- 关于listView、gridView的item的局部刷新
- window下nginx的proxy_pass指向localhost访问时非常慢
- 在control 状态下设置 wlan ——wifi