Maven2上演狸猫换太子――字符编码造成的诡异故障

2024-01-15 10:08

本文主要是介绍Maven2上演狸猫换太子――字符编码造成的诡异故障,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

字符编码界的混乱我们在此不想多提,我们只能祈祷所依赖的平台和环境能够尽可能完善的处理它们

但是,吃芝麻还有掉烧饼的时候,字符编码似乎像赶不走的幽灵,时不时的来恼你一下 这不, Maven2 也被它劫持,跟我来了个狸猫换太子

莫名其妙的没有问题

之前使用 Maven2 作为项目的构建工具,运行的一直很好,虽然每次启动的时候都有

[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!

的警告,但开发机和服务器分别属于 windowslinux 系统,均没有出问题,所以也没有太过在意它。

莫名其妙的出了问题

但是就在昨天,我用 eclipse 打开了几个 xml 并关闭(并未做修改)之后,项目开始出现问题, war 无法被正常部署到 tomcat 上,而使用 mvn tomcat:run-war 直接运行时,提示如下异常:

写道
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 3 of 3-byte UTF-8 sequence.

at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:674)

at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:425)

 

根据提示,找到出此问题的 xml 文件,其中存在中文,但并没有发现什么异常,从 svnrevert ,也无法解决问题。而在服务器( linux 环境)上,没有任何异常出现。

莫名其妙的找不到原因

由于之前被字符编码折磨过多次,而在此之前这些文件中包含中文并没有问题,因此首先意识到是不是 BOM header 的问题,于是找来 UltraEdit ,打开分析出问题的 xml 文件,发现确实前三个字节被 UTF-8BOM header 占据了,于是将其去掉,运行 故障依旧。

此路不通,另辟他径,试着将文件中的中文全部删除,异常没有了

虽然变相的解决了这个问题,但是,没有 BOM header 和不支持中文始终让人感到不爽,而且既然是 UTF-8 的编码,就没有理由让我用回英文。真相还是没有出来。

莫名其妙的被调包了

正向分析找不到原因,看来只能逆向跟踪每个步骤来找线索了(极度怀疑自己是不是破案片看多了)。找到被打包的 war 文件,解压,查看,果然发现 xml 文件被损坏(中文全部变成了乱码)!

看来是中间过程中文件被损坏了。仔细检查了一下整个自动化过程,发现构建、打包的时候有被修改的可能,于是又打开 target 目录下的 class 目录(即打包之前的文件目录),发现这里的 xml 也被破坏了,那么可以初步断定,资源文件在被复制出来的时候,被调了包。

真相大白

经过逐步检查,发现原来是 Maven2 在复制资源文件时,使用系统编码(也就是上面那个警告所提到的)对资源进行解码,从而造成了 UTF-8 文件被当做 GBKwindows 下默认编码是 GBK )来解码,损坏了 xml 文件。而出现这一情况都是昨天在 pom.xml 中加入 resource 标签之后,那么到此问题真相大白了。

既然找到原因所在,那么解决它也很容易,在 maven-resources-plugin 插件中配置 encodingUTF-8 即可,如下:

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

这篇关于Maven2上演狸猫换太子――字符编码造成的诡异故障的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/608528

相关文章

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

Nacos客户端本地缓存和故障转移方式

《Nacos客户端本地缓存和故障转移方式》Nacos客户端在从Server获得服务时,若出现故障,会通过ServiceInfoHolder和FailoverReactor进行故障转移,ServiceI... 目录1. ServiceInfoHolder本地缓存目录2. FailoverReactorinit

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

form表单提交编码的问题

浏览器在form提交后,会生成一个HTTP的头部信息"content-type",标准规定其形式为Content-type: application/x-www-form-urlencoded; charset=UTF-8        那么我们如果需要修改编码,不使用默认的,那么可以如下这样操作修改编码,来满足需求: hmtl代码:   <meta http-equiv="Conte

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。