解决:exlipse环境Maven因 filtering true使用系统属性设置UTF-8的xml文件为GBK导致: Exception 3 字节的 UTF-8 序列的字节 3 无效

4 篇文章 0 订阅
2 篇文章 0 订阅

 

exlipse环境Maven因<filtering>true使用系统属性设置UTF-8的xml文件为GBK导致:

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 3 无效。

 

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from file [XXX.xml]; nested exception is com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 3 无效。
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:410)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252)
	at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127)
	at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93)
	at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
	at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:609)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:510)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
	at XX.XX(XXXX.java:49)
Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 3 无效。
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:687)
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:435)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1735)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanData(XMLEntityScanner.java:1234)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanComment(XMLScanner.java:778)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanComment(XMLDocumentFragmentScannerImpl.java:1038)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2988)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:347)
	at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:76)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:429)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
	... 14 more

 

主要原因是:Eclipse,JDK 与Maven配合还不够默契:
       

        临时解决方法:我将<?xml version="1.0" encoding="UTF-8"?> 改为 <?xml version="1.0" encoding="GBK"?> 后可以临时解决编译运行不报错。
       

      最终解决办法:

解决方法如下:

1.检查开发软件的编码是否正确(比如UTF-8)

2.xml头文件设置的编码格式,检查 xml 的头文件和右键属性里面的编码是否一致,

 <?xml version="1.0" encoding="UTF-8"?>

3.使用maven修改默认模式,在 pom.xml 加入如下配置:

<build>  
    <resources>  
        <resource>  
            <directory>src/main/resources</directory>  
            <filtering>true</filtering>  
        </resource>  
    </resources>  

    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-resources-plugin</artifactId>  
            <configuration>  
                <encoding>UTF-8</encoding>  
            </configuration>  
        </plugin>  
    </plugins>  
</build>

<filtering>true</filtering>是设置使用系统属性或项目属性代替文件属性值,因为获取了系统的编码为gbk,在构建项目是将mapping文件转码成了gbk,从而导致了编码问题。常情况下把这个属性设为<filtering>false</filtering>,使用用<filtering>true</filtering>再加<configuration><encoding>UTF-8</encoding></configuration> ,这个是网友分享的,本人的代码中确实有<filtering>true</filtering> ,但是加了maven-resources-plugin后报其它的错,我这次没有时间去继续研究这个,我用下面第4点解决了:


4.如果还不行,在pom.xml里设置默认编码

<properties>  
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
</properties> 

我使用<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>后,反复测试使用和移除这个配置,都起到了预期的效果,使用总结一下问题的原因如下:

        用文本编辑器将文件查看文件本身就是UTF-8的,只是eclipse自动识别错了,原因是改文件包所在工程确实配置了<filtering>true</filtering>,设置使用系统属性或项目属性代替文件属性值,大概是因为获取了系统的编码为gbk,在构建项目是将mapping文件转码成了gbk,从而导致了编码问题。
       

        我尝试了将出现问题的XML文件和它引用的XML文件都转码为BGK,并设置<?xml version="1.0" encoding="GBK"?>也编译运行不报错,所以再次证明是eclipse认为是xml文件中声明的编码与xml文件本身保存时的编码不一致,所以编译报错。但这个问题居然eclipse的Validation功能默认不报错,除非你确实把编码设置错误,比如编码本身就是UTF-8,但你声明<?xml version="1.0" encoding="GBK"?>,这时eclipse的Validation功能就检测出并显示报错了。
       

        所以,综上所述,说明Eclipse确实有些不完善的地方,或者说与Maven配合还不够默契,Maven启用了<filtering>true</filtering>,设置使用系统属性或项目属性代替文件属性值,Maven自己又不去检测文件的真实编码就是UTF-8,就使用系统属性默认编码GBK将文件转码编译或者设置了构建的文本编码等信息传给了IO流读取,然后JDK提供的解析XML的Jar包却还是按照<?xml version="1.0" encoding="UTF-8"?>来解析,遇到中文注释就报错:com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 3 无效。
       

        我认为Maven私自设置使用系统属性或项目属性代替文件属性值,缺没有告诉Eclipse和JDK,他们没有能配合好,导致问题在编译前和Validation总也没能提前爆出,但是一切都没有完美的东西,所有的问题还是得靠我人自己去解决,提高自己的处理问题的能力,提高技术水平,不停学习领域知识,吸收增长经验是永恒的解决问题之道。

 

 

 

参考:

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException_任何问题都能在StackOverflow找到答案!-CSDN博客_com.sun.org.apache.xerces.internal.impl.io.malform
https://blog.csdn.net/echo_oy/article/details/55118238

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException3字节的UTF-8序列的字节3无效_小异常的博客-CSDN博客_com.sun.org.apache.xerces.internal.impl.io.malform
https://blog.csdn.net/sun8112133/article/details/104693811

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException:3字节的UTF-8序列的字节3无效。_肉团子的博客-CSDN博客
https://blog.csdn.net/litterpp/article/details/77678550

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException:Invalidbyte2of2-byte_业精于勤荒于嬉-CSDN博客
https://blog.csdn.net/baidu_18607183/article/details/47130707

因配置资源文件而引起的“3字节的UTF-8序列的字节3无效”问题_mr_green1024的博客-CSDN博客_3字节的utf-8序列的字节3无效
https://blog.csdn.net/mr_green1024/article/details/81568675

xml3字节的UTF-8序列的字节3无效_weixin_30493321的博客-CSDN博客_androidmanifest.xml:3字节的utf-8序列的字节3无效。
https://blog.csdn.net/weixin_30493321/article/details/99369306

 

Java环境中,为了让不同项目自动切换使用GBKUTF-8编码,你可以通过以下几个步骤进行配置: 1. **系统级别的设置**: - 对于Windows用户,可以在控制面板 -> 系统和安全 -> 系统 -> 高级系统设置 -> 高级选项卡下,找到“环境变量”部分,然后在系统变量里添加或修改`JAVA_TOOL_OPTIONS`,添加`-Dfile.encoding=UTF-8`或`-Dfile.encoding=GBK`。 2. **IDEA(IntelliJ IDEA)**: - 打开IDEA,选择 "File" -> "Settings" -> "Editor" -> "File Encodings",将默认的源文件编码设为你需要的格式(例如UTF-8GBK),然后每个项目的Encoding设置可以独立调整,选中项目后,点击右上角的"..."可以单独为该项目指定编码。 3. **Maven或Gradle项目**: - 在项目的pom.xml (Maven) 或 build.gradle (Gradle) 文件中添加`<project>`标签内的`<properties>`元素,设置`encoding`属性,如: ```xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> ``` 这样所有依赖的编译过程都会使用指定的编码。 4. **Spring Boot应用**: - 在application.properties或application.yml文件中,添加`spring.freemarker.charset=utf-8` 或 `spring.jackson;charset=UTF-8`这样的配置。 每次创建新项目时,按照以上步骤设置编码即可。如果已经有项目,则可以在项目结构中更改文件或资源文件的编码,IDE会记住并应用到相应位置。注意,虽然这种设置可以让编码转换变得自动化,但在处理字符串操作时仍然建议明确地指定编码,以避免乱码问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值