Spring加载xsd引起的问题

spring cvc-elt.1: Cannot find the declaration of element 'beans'

 

  对于这个错误,网上有很多解决方法,其本质就是找不到对应的xsd文件。但好多解决方法都是碰巧并不是对问题本质有了了解后的解决方式。所以我在这里记录下自己的解决方式。

spring加载xsd文件的流程

  要解决上述问题,就需要理解spring加载xsd文件的流程:

  1、spring首先会读取spring jar包下META-INF下的spring.schemas,根据spring.schemas里的映射路径在本地找xsd文件。

  2、如果在本地找不到xsd文件,spring会通过配置文件里的url到官网上下载xsd文件。

发生问题的原因

  通过上述加载xsd的流程,已改可以预见发生问题的原因:

  1、在不能访问外网的情况下,使用的xsd的版本高于使用的spring的版本,spring jar包里没有对应版本的xsd导致

  2、在不能访问外网的情况下,jar包的META-INF目录下的spring.schemas被破坏,没法找到xsd的映射路径

  知道了上述这些之后,我打开了我用maven-shade-plugin打好的jar包,找到META-INF下的spring.schemas,发下里边的映射路径果然不全。掐指一算就知道是maven-shade-plugin打包的问题,它没有将各个jar包里的spring.schemas内容合并到一起,而是采用了覆盖的方式。知道了这个原因后,在maven-shade-plugin里配置如下:

 

1

2

3

4

    

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-shade-plugin</artifactId>
   <version>1.2.1</version>
   <executions>
      <execution>
         <phase>package</phase>
         <goals>
            <goal>shade</goal>
         </goals>
         <configuration>
            <transformers>
               <transformer
                     implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                  <resource>META-INF/spring.handlers</resource>
               </transformer>
               <transformer
                     implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                  <resource>META-INF/spring.schemas</resource>
               </transformer>                   >
            </transformers>
            <shadedArtifactAttached>true</shadedArtifactAttached>
         </configuration>
      </execution>
   </executions>
</plugin>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值