清茶书香

一杯清茶,一本书籍,一个下午。


  • 首页

  • 归档

  • 分类

  • 关于

  • 搜索
Redis JPA Solr SpringData SpringMVC localRepository local Mapper 事务 Mybatis JDBC AOP DI IOC 常用函数 触发器 存储过程 Promise Gateway SpringCloud vue-cli axios es6 webpack npm vue 个性化 zsh 终端 caffeine jvm缓存 guava cache validation Mapping MapStruct comment 小程序 建站 WeHalo config logback plugins database idea maven spring https http nginx password RabbitMQ 秒杀系统 Windows MySQL 数据备份 halo SpringBoot shell Linux ip Optional Stream Lambda k8s Docker 列编辑 vim MacOS 图片合成 Java 远程联调 nps 内网穿透

maven管理spring,运行项目时出现spring-beans.xsd文档找不到异常

发表于 2019-06-13 | 分类于 Java | 0 | 阅读次数 191

异常信息

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

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

Bennett wechat
欢迎收藏我的微信小程序,方便查看更新的文章。
  • 本文作者: Bennett
  • 本文链接: https://hibennett.cn/archives/spring-beans-err
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# Java # spring # maven # idea
Spring Core之IOC与DI
  • 文章目录
  • 站点概览
Bennett

Bennett

60 日志
28 分类
74 标签
RSS
Github E-mail Gitee QQ
Creative Commons
Links
  • MacWk
  • 知了
0%
© 2020 — 2023 hibennett.cn版权所有
由 Halo 强力驱动
|
主题 - NexT.Pisces v5.1.4

浙公网安备 33010802011246号

    |    浙ICP备2020040857号-1