一次Spring项目打包问题排查的实战记录

论坛 期权论坛 脚本     
niminba   2021-5-23 03:17   2323   0

一个 Spring 项目,打成 jar 包之后运行,在有网络的时候是正常的,但是一旦无网络就会报错,具体是怎么回事呢?这篇文章就来记录下这次问题排查经过。

背景介绍

一个图形化的界面,带本地数据库,要求可以在无网络环境下运行,我帮朋友用的 Java 写的图形化界面,虽然不是很美观,但是胜在熟悉 Java。

项目使用的是 idea 的「Build Artifacts」打包,打包之后运行正常,界面和数据库访问都正常,最开始报过几次错,后来就没出现了,也没找到原因,就先那样了。

后来发给别人了,完全打不开,跟之前的报错一样,看来必须要搞清楚报错的原因了。

问题排查

报错内容

首先贴一下报错的信息:

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:
Line 8 in XML document from class path resource [spring.xml] is invalid;
nested exception is org.xml.sax.SAXParseException;
lineNumber: 8; columnNumber: 76;
cvc-elt.1: 找不到元素 'beans' 的声明。

spring.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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
</beans>

问题复现

因为我之前也碰到过这个报错,所以想着复现一下问题,方便排查。

我直接在虚拟机中运行,无论是覆盖安装还是卸载再次安装都没问题,我就想可能是环境问题导致的吧,就想着装一个新的虚拟机试一下。

新系统装完之后,一运行,果然崩溃了,报错信息一样。能复现问题,可以说为解决问题开了个好头。

问题排查

找到原因

通过关键字 cvc-elt.1: 找不到元素 'beans' 的声明 开始搜索,搜索到的结果基本都是以下的内容。

配置文件头部配置的 xsd 版本信息不正确,造成解析时出错。spring 头部 xsd 或 dtd 校验文件的查找分两步,第一先从本地 jar 包中找,如果找到则用本地jar包的进行校验(可以在 spring-beans.jar 或 spring-context.jar 里的 META-INF 下的 spring.schemas 文件中找到 xsd 文件位置的定义),如果没有找到则进行第二步查找,它会尝试从网络中下载该文件然后校验,如果系统断网或下载不下来,则会抛出上述异常。

照着这个思路,朋友也提醒我,看下虚拟机的系统是否联网了,我一看,果然没联网,赶紧联网测试发现能正常运行,问题的原因找到了。

再次困惑

找到了问题原因,好像就马上就能解决了,但事实并不是我想的那样。

网上的解决办法是:

将 applicationContext.xml 中 xsd 文件定义的版本改为 spring jar 包中定义的 xsd 的版本,如果版本定义的太高在本地会无法找到,只能从网络上下载。

但是,查看 spring-beans.jar 里 META-INF 下的 spring.schemas 文件,发现无论版本号是多少,最后指向的都是一个。

截取了部分代码如下:

http\://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.1.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.2.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-4.0.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-4.1.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-4.2.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-4.3.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans.xsd=org/springframework/beans/factory/xml/spring-beans.xsd

后来又搜到一篇文章「spring5之SAXParseException9#'9o n. BHHYHLK] XKLLH\H[[!yb,\e B[[OH . [ Bb,9i:/l 9(T[d99,y.,:/9&al[d9ykz+'9c..cy%c"9al#9&.#i&i&+/c.

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP