Code Bye

打成jar包找不到spring配置文件?

maven项目,eclipse export runnable jar之后,
运行jar java -jar xxx.jar 找不到jar包中的spring配置文件
下面是项目结构:

我可以确定打成的jar文件没问题,applicationContext在根目录下

启动的main方法:

public static void main(String[] args) {
		ApplicationContext context =new ClassPathXmlApplicationContext(new String[]    {"applicationContext.xml","task.xml"});
}

运行后报错:

hy
[2013-07-24 09:55:23,864   INFO at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:315)] Loading XML bean definitions from class path resource [applicationContext.xml]
Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/context]
Offending resource: class path resource [applicationContext.xml]

求一个解决办法,怎么才能找到这个配置文件呢,扯蛋的就别回答了.

jar包中的类通过如下方法获得配置文件路径或加载配置文件 ,原理是在运行时通过类的classLoader获得资源
URL fileURL=this.getClass().getResource(“/config/application.xml”);//jar中的类获得jar包中资源文件的路径
InputStream is=this.getClass().getResourceAsStream(“/config/application.xml”);//jar中的类读入jar包中的资源文件
引用 2 楼 u011375555 的回复:

jar包中的类通过如下方法获得配置文件路径或加载配置文件 ,原理是在运行时通过类的classLoader获得资源
URL fileURL=this.getClass().getResource(“/config/application.xml”);//jar中的类获得jar包中资源文件的路径
InputStream is=this.getClass().getResourceAsStream(“/config/application.xml”);//jar中的类读入jar包中的资源文件

老大,我加载spring呢,能这么加载吗

加载spring如果不是默认目录,肯定要指定文件路径,总不可能spring在整个jar里面遍历xml文件吧
引用 4 楼 shy315 的回复:

加载spring如果不是默认目录,肯定要指定文件路径,总不可能spring在整个jar里面遍历xml文件吧

我指定的就是根目录,怎么可能遍历,……
麻烦你知道spring ClassPathXmlApplicationContext 怎么加载的再来说好吧
也麻烦你仔细看我说的我是怎么加载的.

没看仔细,被1L带沟里了
Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/context]
xml文件内容有问题,开头几行贴一下吧可能http://www.springframework.org/schema/context相关的内容删掉就可以了
引用 6 楼 shy315 的回复:

没看仔细,被1L带沟里了
Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/context]
xml文件内容有问题,开头几行贴一下吧

可能http://www.springframework.org/schema/context相关的内容删掉就可以了

确定没问题 ,可以run的,导成jar以后不行了就是

好久没打jar包,都忘了有这茬儿,
用常用的方法获取配置文件要放在jar外。
在jar里面,一种是用解析jar文件的方式,一种是2L说的那种。
ClassPathXmlApplicationContext这个类只能读放在web-info/classes目录下的配置文件,你卡看你这个目录下有没有这个东西再说。
引用 9 楼 fangmingshijie 的回复:

ClassPathXmlApplicationContext这个类只能读放在web-info/classes目录下的配置文件,你卡看你这个目录下有没有这个东西再说。

不是web项目,怎么会有web-info
再说要是是web项目,干嘛打成jar包,直接就war包了

引用 8 楼 shy315 的回复:

好久没打jar包,都忘了有这茬儿,
用常用的方法获取配置文件要放在jar外。
在jar里面,一种是用解析jar文件的方式,一种是2L说的那种。

那怎么能放到jar外呢?

就跟jar文件相同目录
自己好好去学习ClassPathXmlApplicationContext这个类的加载路径。

40分
你好,我也发现了这个问题,去网上查了一下,试了,如果你是工程直接调用该jar包(classPath相同)的话,用下面的:
ApplicationContext context = new ClassPathXmlApplicationContext(“classpath*:config/appContext.xml”);
即加载处于classpath下的文件,但是这个加载不直观,因为即使找不到文件,spring也不会报错,只是返回的applicationContext没有内容,这种可以直接读取到
引用 13 楼 fangmingshijie 的回复:

自己好好去学习ClassPathXmlApplicationContext这个类的加载路径。

对你这种不懂装懂 我除了XX二字没什么送你了

引用 14 楼 xiao415018644 的回复:

你好,我也发现了这个问题,去网上查了一下,试了,如果你是工程直接调用该jar包(classPath相同)的话,用下面的:
ApplicationContext context = new ClassPathXmlApplicationContext(“classpath*:config/appContext.xml”);
即加载处于classpath下的文件,但是这个加载不直观,因为即使找不到文件,spring也不会报错,只是返回的applicationContext没有内容,这种可以直接读取到

这种 classpath 还有 classpath* 我也试过了 也取不到
不过我的没有conf这一层目录 我的在根目录下
我也看网上说了,但是我的目录结构看我发的图,maven的结构就这样我没有conf这一层目录的

引用 15 楼 awl910213 的回复:
Quote: 引用 13 楼 fangmingshijie 的回复:

自己好好去学习ClassPathXmlApplicationContext这个类的加载路径。

对你这种不懂装懂 我除了XX二字没什么送你了

好吧,你赢了。傻逼

写过几个项目就以为自己什么都懂了,懂了还到这里问你妹呀,别人好心给你解答,你还XX,xx你妹啊。
觉得很奇怪,如果将该jar包放到其他工程下并进行加载的时候,我说的那个方法是可以运行的(亲自尝试),你可以新建一个工程,把jar包打好放上去,用代码调用能够正确执行,但是如果是可执行/或者调用执行时会出现找不到文件的情况,现在没有办法我都改成properties的形式了,如果有时间再研究,可能是代码问题。但是我觉得spring作为这样一个成熟的框架,应该开发一个可以供Resource或者inputStream类型输入的ApplicationContext,这样搞前无头,后无绪,有点无奈了。。。
引用 18 楼 fangmingshijie 的回复:

写过几个项目就以为自己什么都懂了,懂了还到这里问你妹呀,别人好心给你解答,你还XX,xx你妹啊。

SB,不懂不要回答问题,OK?看着你这种人就心烦

引用 19 楼 xiao415018644 的回复:

觉得很奇怪,如果将该jar包放到其他工程下并进行加载的时候,我说的那个方法是可以运行的(亲自尝试),你可以新建一个工程,把jar包打好放上去,用代码调用能够正确执行,但是如果是可执行/或者调用执行时会出现找不到文件的情况,现在没有办法我都改成properties的形式了,如果有时间再研究,可能是代码问题。但是我觉得spring作为这样一个成熟的框架,应该开发一个可以供Resource或者inputStream类型输入的ApplicationContext,这样搞前无头,后无绪,有点无奈了。。。

确实是那样的情况,我也有点搞不懂诶…

引用 20 楼 awl910213 的回复:
Quote: 引用 18 楼 fangmingshijie 的回复:

写过几个项目就以为自己什么都懂了,懂了还到这里问你妹呀,别人好心给你解答,你还XX,xx你妹啊。

SB,不懂不要回答问题,OK?看着你这种人就心烦

我去你玛丽隔壁

new ClassPathXmlApplicationContext(new String[]{xx你妹.xml})是从web-info/classes取,废物东西。
你这种人就像条疯狗一样,别人给你骨头吃,你还反口咬人。从楼上几个人回复你的问题来看,你态度很是恶劣,别人在帮助你,又不是xx你妹,你恶劣什么?自己很懂,这么简单的问题还拿出来问个球?不知好歹的废物一个,再说一句,我去你玛丽隔壁。
引用 23 楼 fangmingshijie 的回复:

new ClassPathXmlApplicationContext(new String[]{xx你妹.xml})是从web-info/classes取,废物东西。

你搞清楚什么叫做classpath再说吧

引用 25 楼 awl910213 的回复:
Quote: 引用 23 楼 fangmingshijie 的回复:

new ClassPathXmlApplicationContext(new String[]{xx你妹.xml})是从web-info/classes取,废物东西。

你搞清楚什么叫做classpath再说吧

我看是你个傻逼废物不明白

我也遇到这个问题了 但是我的解决了 我直接用myeclipse打war包 打jar包的时候勾选Add directory entries 就可以了 
上次我虽然改成了properties方法,但是后来又出现一个问题,也是quartz调用Jar包时出现的问题,会出现找不到本Jar包内的类而报错,我想,如果是类或者文件加载不上,可能是由于调用和本jar包内的ClassLoader不一致,于是,使用了强行切换ClassLoader的方法
比如本jar包内有XXX.class
那么使用
ClassLoader classLoader2 = XXX.class.getClassLoader();
//因为可能存在调用工程ClassLoader与当前job运行的ClassLoader不一致而导致类加载失败,所以将运行线程的classLoader设置为当前类ClassLoader路径
Thread.currentThread().setContextClassLoader(classLoader2);
spring和xstream(我用的工程组件)都需要读取ClassLoader,如果线程ClassLoader不与本jar包的加载Loader相同,可能会导致文件找不到,如果你还在为此困惑的话,可以试一试,我由于已经取代了spring读取,所以没有经过后来的尝试,全靠你了!
哥们,我也越到这个问题了,你解决了没有,我整了一天,怎么弄都不行!
这个问题怎么解决的,最后?
引用 30 楼 Smallhorn 的回复:

这个问题怎么解决的,最后?

1.参考14楼读配置
2.参考27楼打包
ps..如果有hibernate的 hbm.xml参考http://xiaoyaocao.iteye.com/blog/1837133

最后怎么解决呢、。?
打包的问题,fat jar打包默认只把jar里面的配置(handler类,好像),只加载第一行,所以有的东西找不到处理类。找到那个东西直接拷贝到你的jar包的相应的地方,看报错信息应该可以找到。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明打成jar包找不到spring配置文件?