异常信息

异常信息我摘出主要信息如下:

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