maven管理spring,运行项目时出现spring-beans.xsd文档找不到异常
异常信息
异常信息我摘出主要信息如下:
org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 77; schema_reference.4: 无法读取方案文档 'https://www.springframework.org/schema/beans/spring-beans.xsd', 原因为 1) 无法找到文档; 2) 无法读取文档; 3) 文档的根元素不是 <xsd:schema>。
......
Caused by: java.net.ConnectException: Connection timed out: connect
我的xml配置文件的约束如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
</beans>
产生的原因
根据我查询多方资料得出,此异常产生的原因主要是联网查询这个spring-bean.xsd文档时,由于网络超时导致没有找到这个文档(国内访问外网出现网络不稳定很正常)。但是,实际上spring也并不是每次运行项目都是去网络上找这个文档,而是先去找本地的这个文档(下载的spring依赖里面是有这个文档的,在spring-bean-5.1.5.RELEASE.jar里的org.springframework.beans.factory.xml里的spring-beans.xsd)。如果找不到你指定的版本文档,那么它才会去网络上获取文档。
解决方案
那么解决此问题就有以下几种解决方案:
-
如果用的是官网的给出的约束示例,就像我的一样使用的是https开头的。需要改为http。
spring的文档加载是通过spring-bean-5.1.5.RELEASE.jar里的META-INF/spring.schemas配置文件中的键来获取对应的值,从而找到对应的文档。而这个键就是约束里的
https://www.springframework.org/schema/beans/spring-beans.xsd
这条信息,它和配置文件中的键是不对应的,官方的示例用的是https开头的,但配置文件里用的还是http开头的键。所以为了能找到文档就需要使用http://www.springframework.org/schema/beans/spring-beans.xsd
作为约束。 -
如果你指定了spring-bean.xsd的版本,但是你本地并没有该版本那么把版本号删掉或者改成你有的版本。
本地如果没有你指定的版本,它就会去网上找这个版本的文档,然后出现这个异常。最简单的就是不要使用带版本号的约束,也不建议使用。因为不带版本号的默认就使用你当前最新的那个版本。
-
最后就是打包插件的问题,idea默认的打包插件或者assembly打包插件都会出现这种问题,推荐使用另一款打包插件shade。
默认的打包插件并不会把你所有的依赖都打包在一起,这样的话你最终打成的包里面就没有spring的本地文件,那么运行时就需要使用网络资源,然后再出现网络波动就会出现本文的这个异常。而assembly这个打包插件有个bug,由于工程往往依赖很多的jar包,而被依赖的jar又会依赖其他的jar包,这样,当工程中依赖到不同的版本的spring时,在使用assembly进行打包时,只能将某一个版本jar包下的spring.schemas文件放入最终打出的jar包里,这就有可能遗漏了一些版本的xsd的本地映射,进而出现了文章开始提到的错误。而shade能够将所有jar里的spring.schemas文件进行合并,在最终生成的单一jar包里,spring.schemas包含了所有出现过的版本的集合!
以下给出shade的插件配置信息
<build> <!-- 引用shade插件 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> </plugin> </plugins> <pluginManagement> <plugins> <!-- shade插件配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.3</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 我练习的JavaSE部分的spring,所有这里配置了主类,你们如果需要也可有换成你们自己的主类的路径 --> <mainClass>com.spring.Launcher</mainClass> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement> </build>
以上就是maven管理spring,运行项目时出现spring-beans.xsd文档找不到异常出现的原因以及解决方式。问题解决了的不用吝啬你们小手哦,帮忙点个赞,欢迎分享,点关注。
参考文献:
作者:bluishglc
来源:CSDN
原文:https://blog.csdn.net/bluishglc/article/details/7596118