项目启动,无法加载Spring xsd文件

项目启动,无法加载Spring xsd文件问题的产生:有个Java项目(Jar文件),每半小时重启一次,对外提供服务。突然收到报警,早上5点半重启服务时出错,服务无法正常启动。查看启动日志,错误是xml解析失败,无法找到xml元素的声明。具体报错日志如下:INFO:LoadingXMLbeandefinitionsfromclasspathresource[applicationContext-task

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

问题的产生:Java项目打包部署,服务启动时出错,服务无法正常启动。

查看启动日志,错误是 xml解析失败,无法找到xml元素的声明。

具体报错日志如下:

INFO: Loading XML bean definitions from class path resource [applicationContext-task.xml]

org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 109; schema_reference.4: Failed to read schema document 
‘http://www.springframework.org/schema/beans/spring-beans.xsd’, because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)

Caused by: java.io.IOException: Server returned HTTP response code: 522 for URL: http://www.springframework.org/schema/beans/spring-beans.xsd
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:647)
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189)
at com.sun.org.apache.xerces.internal.impl.xs.opti.SchemaParsingConfig.parse(SchemaParsingConfig.java:582)
at com.sun.org.apache.xerces.internal.impl.xs.opti.SchemaParsingConfig.parse(SchemaParsingConfig.java:685)
at com.sun.org.apache.xerces.internal.impl.xs.opti.SchemaDOMParser.parse(SchemaDOMParser.java:530)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchemaDocument(XSDHandler.java:2171)
… 29 more

Exception in thread “main” org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 8 in XML document from class path resource [applicationContext-task.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 109; cvc-elt.1: Cannot find the declaration of element ‘beans’.
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:399)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)

at org.springframework.context.support.GenericXmlApplicationContext.<init>(GenericXmlApplicationContext.java:69)
at com.jack.qingsonglvxing.b2b.Run.main(Run.java:9)
Caused by: org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 109; cvc-elt.1: Cannot find the declaration of element ‘beans’.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
… 9 more

错误信息很明确,
访问 http://www.springframework.org/schema/beans/spring-beans.xsd 文件报错,网络错误。
经过测试(国内访问测试、北美访问测试),可以确定,Spring的服务挂了(在2016年5月15日早上5点~5点半的某一时刻),如下图:
项目启动,无法加载Spring xsd文件

为何会出现,Spring服务挂了,会影响本地服务呢?

有些公司(尤其银行),在没有网络的情况下,也没有出现过该问题哪?

肯定是本地开发、部署、发布的某个环节存在BUG,从而导致该问题。

网上查询资料,果然发现了相同的问题,

博文(http://blog.csdn.net/bluishglc/article/details/7596118)

详细说明了Spring加载schema的原理和顺序,也提出了出现上述问题的原因。

内容转载如下:
—————————————————-

项目启动,无法加载Spring xsd文件

项目启动,无法加载Spring xsd文件

项目启动,无法加载Spring xsd文件

项目启动,无法加载Spring xsd文件

项目启动,无法加载Spring xsd文件

—————————————————-

另一篇博文(http://www.360doc.com/content/15/0113/11/3639038_440376349.shtml)
则详细描述了使用 maven-assembly-plugin 插件时出现的问题,以及解决方案,
内容转载如下:
—————————————————–
现在基本上都是采用maven来进行开发管理,我有如下需求:
需要把java工程打成可执行的jar包,必需把依赖的jar包也一起打包。
而maven默认的package命令构建的jar包中只包括了工程自身的class文件,并没有包括依赖的jar包。
可以通过配置maven-assembly-plugin插件来打包,pom具体配置如下:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.4</version>
  <configuration>
    <archive>
      <manifest>
        <!–<addClasspath>true</addClasspath>–>
        <mainClass>com.xxx.MainClass</mainClass>
      </manifest>
    </archive>
    <descriptors>
      <descriptor>src/main/assembly/package.xml</descriptor>
    </descriptors>
  </configuration>
  <executions>
    <execution>
      <id>make-assembly</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
</plugin>

其中<mainClass></mainClass>的值表示此工程的入口类,也就是包含main方法的类。

配置完pom后可以通过执行mvn assembly:assembly命令来启动插件进行构建。

构建成功后会生成jar包,这样我们就可以在命令行中通过java -jar XXX.jar来运行jar件了。

不过使用此插件会有一些问题:

工程中依赖了spring框架的jar包,打包成功后使用命令来调用jar包时报错如下(内网环境):
org.xml.sax.SAXParseException: schema_reference.4: 
Failed to read schema document ‘http://www.springframework.org/schema/beans/spring-beans-3.0.xsd’, 
because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
 

究其原因,在网上找到一篇文章对此有比较详细的解释:

http://blog.csdn.net/bluishglc/article/details/7596118 

简单来说就是spring在启动时会加载xsd文件,它首先会到本地查找xsd文件(一般都会包含在spring的jar包中),如果找不到则会到xml头部定义的url指定路径下中去寻找xsd,如果找不到则会报错。

附:在spring jar包下的META-INF文件夹中都会包含一个spring.schemas文件,其中就包含了对xsd文件的路径定义,具体如下图所示:
项目启动,无法加载Spring xsd文件
 

由于我的工程在内网,所以通过url路径去寻找肯定是找不到的,但是比较奇怪的是既然spring的jar包中都会包含,那为什么还是找不到呢?

原来这是assembly插件的一个bug,具体情况参见:http://jira.codehaus.org/browse/MASSEMBLY-360

该bug产生的原因如下:

工程一般依赖了很多的jar包,而被依赖的jar又会依赖其他的jar包,

这样,当工程中依赖到不同的版本的spring时,在使用assembly进行打包时,只能将某一个版本jar包下的spring.schemas文件放入最终打出的jar包里,这就有可能遗漏了一些版本的xsd的本地映射,所以会报错,所以一般推荐使用另外一个插件(maven-shade-plugin)来打包。

shade插件打包时在对spring.schemas文件处理上,它能够将所有jar里的spring.schemas文件进行合并,

在最终生成的单一jar包里,spring.schemas包含了所有出现过的版本的集合。

maven-shade-plugin插件配置如下:

<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.AppendingTransformer”>
            <resource>META-INF/spring.handlers</resource>
          </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.ManifestResourceTransformer”>
            <mainClass>com.xxx.MainClass</mainClass>
          </transformer>
        </transformers>
      </configuration>
    </execution>
  </executions>
</plugin>

<transformer implementation=”org.apache.maven.plugins.shade.resource.AppendingTransformer”>
  <resource>META-INF/spring.schemas</resource>
</transformer>
上面这段配置意思是把spring.handlers和spring.schemas文件以append方式加入到构建的jar包中,这样就不会存在出现xsd找不到的情况。

配置完pom后,调用mvn clean install命令进行构建,构建成功后打开工程target目录,发现生成了2个jar包,

一个为:original-XXX-0.0.1-SNAPSHOT.jar,

另一个为:XXX-0.0.1-SNAPSHOT.jar,

其中 original…jar里只包含了工程自己的class文件,而另外的一个jar包则包含了工程本身以及所有依赖的jar包的class文件。

我们只需要使用第二个jar包就可以了。

PS,写在后面,本博文完成之际,Spring服务已经恢复。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/206738.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pc端、手机端浏览器、微信内.点击返回键,返回到上一个页面浏览的位置的实现

    pc端、手机端浏览器、微信内.点击返回键,返回到上一个页面浏览的位置的实现pc端、手机端浏览器、微信内.点击返回键,返回到上一个页面浏览的位置的实现

  • 如何通俗的理解函数的极限_不理解函数极限的定义![通俗易懂]

    如何通俗的理解函数的极限_不理解函数极限的定义![通俗易懂]极限定义里,为什么用“存在”“任意”“不等式”的数学语言来定义极限?怎样将普通语…楼主的问题显然是有备而来,是经过严格逻辑分析后有感而发的问题。确确实实,我们的高数教师,在教极限时,其实他们的大多数,也只是跟着和尚就念经,跟着道士就画符。解释来解释去就是那么死板板的几句话,连他们自己也没有makesense,教师如此,教科书如此,学生也只能以葫芦画瓢,难以彻底理解。下面尝试一下,看看能不…

  • 怎么查看数据库端口(sqlserver数据库端口查看)

    more$ORACLE_HOME/db/install/portlist.ini 或者使用netmanager

  • 转:三款免费好用的Gif录屏神器

    转:三款免费好用的Gif录屏神器原文链接:三款免费好用的Gif录屏神器自己用了ScreenToGif版本2.14.1下载地址原文内容:三款免费好用的Gif录屏神器2018年06月02日18:52:21独家雨天阅读数:147531.免费开源的GIF录制工具ScreenToGif官网地址:http://www.screentogif.c…

  • 矩阵的秩及其求法

    矩阵的秩及其求法矩阵的秩及其求法矩阵秩的概念k阶子式矩阵的秩矩阵秩的求法1、子式判别法(定义)2、用初等行变换求矩阵的秩满秩矩阵矩阵秩的概念k阶子式定义1:设A=(aij)m×nA=(a_{ij})_{m\timesn}A=(aij​)m×n​在AAA中任取kkk行kkk列交叉处元素按原相对位置组成的kkk(1≤k≤min{m.n})(1\leqk\leqmin\lbracem.n\rbrace)(1≤k≤min{m.n})阶行列式,称为AAA的一个kkk阶子式。m×nm\timesnm×n的矩阵A

  • vscode搭建react框架(vscode补全js方法)

    文章目录一、安装node二、配置淘宝镜像三、配置vscode(win10)四、全局安装脚手架五、创建项目一、安装node请在官网下载安装:https://nodejs.org/zh-cn/vscode中点击(ctrl+`)调出终端输入指令node-v,能显示版本号,说明node已经装好了输入指令npm-v,能显示版本号,说明npm可以使用了点击链接查看图文教程https://blog.csdn.net/qq_45677671/article/detail

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号