elasticsearch+spring配置文件报错问题

这是最新更新,放在最前面。

这次打包后才报错问题,很可能是eclipse编译时同路径同名文件冲突造成的。项目引用的好多个jar包里也是有META-INF\spring.handlers这个文件的,eclipse自带的编译功能把项目编译成jar时,只会加载第一个出现的同路径同名文件,而spring-data-elasticsearch-2.1.23.RELEASE.jar的META-INF\spring.handlers则因冲突没了,当程序里需要用到这个配置时自然就报错了。

虽然先前我误打误撞解决了问题,但是现在更新的才应该是正确的解题思路,有问题的同路径同名配置文件内容进行人工合并(META-INF\spring.schemas和META-INF\spring.handlers),也就是打开相关jar里这两个文件,将每一行都复制出来合并成新的俩文件放到src下再编译。

--------------------------------------------------------------------------------------

       最近有需要做elasticsearch相关的东西,我就用了spring-data-elasticsearch来集成spring。写的代码程序在eclipse上运行的好好的,结果打包成jar运行就出问题报错了。

警告: Ignored XML validation warning
org.xml.sax.SAXParseException; lineNumber: 12; columnNumber: 98; schema_reference.4: 无法读取方案文档 'http://www.springframework.org/schema/beans/spring-beans-4.0.xsd', 原因为 1) 无法找到文档; 2) 无法读取文档; 3) 文档的根元素不是 

配置文件application.xml出了问题,文件如下



	
	

	
	

	
	
		
	

网上有些说法可能是无法联网,可是我也写过很多spring程序,断网也运行的好好的,而且我这个程序将来也是要在无公网的环境中运行的。还有的做法修改xsd版本号啊,去掉版本号啊,通通不行。

有些博客说断网spring也会优先从本地的jar文件中找方案文档,我看了看我使用的spring-beans-4.3.26.RELEASE.jar,的确里边应有尽有:

 

elasticsearch+spring配置文件报错问题_第1张图片

后来我在一篇文章里看到有种做法是跳过Spring的XML校验,其文章不知道被转了多少手(在网上有多篇不同地址不同平台内容却完全一致),内容观感很差,我看到的方式如下:

GenericXmlApplicationContext context = new GenericXmlApplicationContext();

context.setValidating(false);

那么写在我的代码中就是这样,程序运行一开始时的代码:

		GenericXmlApplicationContext context = new GenericXmlApplicationContext();
		context.setValidating(false);
		context.load("config/application.xml");
		context.refresh();

,前边的问题不再出现,然后又出错了,同样的在eclipse上运行正常,打包成jar又有问题了。

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/data/elasticsearch]
Offending resource: class path resource [config/application.xml]

然后还是上边我提到的观感很差的文章评论里有人指路的一篇博客http://blog.csdn.net/bluishglc/article/details/7596118,也是这篇博文让我了解了spring是从哪加载验证文档的,

其实呢根据这篇博文里的说法,我的前一个问题是生成的jar运行包里META-INF\spring.schemas这个文件里少了我所引用的xsd,而事实上也是这样,我用解压软件打开运行jar包,里边是有这个文件,在META-INF\spring.schemas里加上缺少的行后,去掉忽视验证的java代码,确实jar断网也不报第一个错误了(第二个错误还在)。

扯远了,回归正题,因为这篇博文的原因,我有去百度spring.schemas,看了一些文章同时也介绍了META-INF\spring.handlers,所以呢我就在spring-data-elasticsearch-2.1.23.RELEASE.jar中找到了这个类ElasticsearchNamespaceHandler,然后在META-INF\spring.handlers加上一行,终于解决了这个问题,如下

http\://www.springframework.org/schema/data/elasticsearch=org.springframework.data.elasticsearch.config.ElasticsearchNamespaceHandler

总结,这俩问题的根源就是spring.schemas和spring.handlers,或许是导入的jar包版本冲突导致编译器不能正常生成正确的文件吧。我在网上看到的解决方法里有说用shade来编译的,但是这是要maven项目的,我这就是个普通的程序,并没有使用maven,虽然有用过maven,但是不喜欢所以就没怎么用过了(主要是使用maven时,会下载很多很多的jar,一些不需要的也给我下载来)。

----------------------------------分割线----------------------------------------

更新一下第二个问题,上边我说过spring.handlers文件加一行声明elasticsearch的handler就行了,这没错,但是呢我很认真的看了这个文件里的其他行,根本就没有我在配置文件里声明的其他handler,然后打算测试一下,把除了ElasticsearchNamespaceHandler的其他行通通删除,程序依然运行正常(无网络环境),真是有点搞不懂了。

总之我的程序最终修改结果就是

1.使用GenericXmlApplicationContext忽略文档验证;

2.在项目src文件下创建META-INF\spring.handlers,内容只有ElasticsearchNamespaceHandler那行。

这样打包后的jar就没必要我手动去修改spring.schemas和spring.handlers了。

 

你可能感兴趣的:(elasticsearch,java,spring,eclipse)