`
snoopy7713
  • 浏览: 1152379 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

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

阅读更多

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

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

莫名其妙的没有问题

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

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

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

莫名其妙的出了问题

但是就在昨天,我用 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 文件,其中存在中文,但并没有发现什么异常,从 svn revert ,也无法解决问题。而在服务器( linux 环境)上,没有任何异常出现。

莫名其妙的找不到原因

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

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

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

莫名其妙的被调包了

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

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

真相大白

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

既然找到原因所在,那么解决它也很容易,在 maven-resources-plugin 插件中配置 encoding UTF-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离线安装包

    标题“maven2离线安装包”指的是针对Maven 2的不依赖网络环境的安装包,主要用于在没有互联网连接或者网络环境不稳定的情况下安装和使用Maven。Maven是一个项目管理和综合工具,它简化了Java项目的构建、依赖管理和...

    maven2 的eclipse插件

    maven2的eclipse插件 for eclipse 3.5+。 插件安装时,我们只需在eclipse根目录下新建一个【links】目录,然后在里面创建【.link】扩展名的文件,在里面写上类似于【path=F:\\IDE\\eclipsePlugin\\maven2】这样的...

    maven2详细教程

    【Maven 2 详细教程】是一份专为开发者准备的指南,旨在详细介绍Apache Maven 2的使用方法和核心概念。Maven 2是一个强大的构建工具,尤其在处理大型、多模块的Java项目时,能够简化构建过程和依赖管理。在现代软件...

    IDEA编码GBK不可映射字符解决方法

    2. understands GBK编码的特点:GBK编码是一种简体中文编码方案,它支持 Unicode 字符的子集。但是,GBK编码不支持所有 Unicode 字符,这可能会导致IDEA在编译代码时出现错误。 3. 使用UTF-8编码:UTF-8是一种通用的...

    maven2之m2eclipse使用手册

    maven2之m2eclipse使用手册.doc

    Maven 3.6.3文件 setting文件已替换华为云maven镜像

    Maven是Java开发中的一款项目管理和综合工具,它简化了构建过程,通过提供一个标准化的构建系统,使得项目依赖管理变得更加简单。Maven 3.6.3是Maven的一个稳定版本,它带来了许多改进和修复,提升了构建效率和用户...

    maven2maven3eclipse通用版本插件

    支持maven2 maven3 通用版本eclipse插件,在maven官网下载apache-maven-3.2.1-bin.zip,解压插件压缩包到path=D:\m2e-0.12.0.20101115-1102 在eclipse新建links文件夹,新建文件maven23.link,内容为:path=D:/m2e-...

    maven2 jar包

    maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包 maven2 jar包

    maven2 eclipse

    标题 "maven2 eclipse" 暗示了我们要讨论的是如何在 Eclipse 集成管理 Maven 项目。这篇博文可能是关于如何将 Maven 2.x 集成到 Eclipse 开发环境中,以便更有效地构建和管理Java项目。Maven 是一个项目管理和综合...

    Maven发布Jar包中文乱码解决方法

    2. 在 Maven 命令中添加-Dfile.encoding=UTF-8 参数: `mvn clean package -Dfile.encoding=UTF-8` 3. 在项目的 resource 文件夹下添加一个资源文件 encoding.properties,内容如下: `encoding=UTF-8` 三、详细...

    Apache Maven 2 Effective Implementation

    ### Apache Maven 2 有效实施知识点详解 #### 一、Apache Maven 2 概述 Apache Maven 是一个项目管理和理解工具。它包含了构建过程(build process)、软件项目信息和最佳实践指南。Maven 的主要目标是让构建过程...

    替换myeclipse默认maven插件

    myeclipse自带有maven插件相难用,而且不能创建maven项目,需要独立安装,即可顺利创建maven项目。 1、删除默认的maven,在该目录下直接搜索maven,删除所有相关的jar和目录。 2、下载maven文件,从...

    Maven3.6.3安装与配置以及IDEA2022.2.3部署Maven的教程

    ### Maven 3.6.3 的安装与配置详解 #### 一、Maven 3.6.3 的安装步骤 **1.1 确保 Java 环境已安装** - **前提条件**: Maven 是 Java 项目构建工具,因此在安装 Maven 之前,请确保您的计算机上已经正确安装了 ...

    maven项目sturts2 demo

    【Maven项目Struts2 Demo】是一个典型的Java Web应用程序示例,它利用了Apache Maven作为构建工具,Struts2作为MVC(Model-View-Controller)框架,以及JDK 1.7、Eclipse 4.5和Tomcat 6作为开发和运行环境。...

    maven 3.5.2 maven 3.5.2 maven 3.5.2

    ** Maven 概述** Maven 是一个强大的项目管理和构建工具,广泛应用于Java开发领域。它通过使用一个统一的构建过程,简化了项目的构建、依赖管理以及文档生成等任务。Maven 3.5.2是Maven的一个稳定版本,包含了众多...

    maven之开源中国Maven库

    【标题】"maven之开源中国Maven库" 指的是使用 Maven,一个流行的Java项目管理和集成工具,与开源中国的Maven仓库进行交互。开源中国Maven库是中国的一个开源软件资源平台,提供了大量的开源Java库,使得开发者可以...

    maven2 plugin for eclipse

    maven2的插件,用于在eclipse下进行maven2的快速配置 打开eclipse .选择菜单 window -&gt;preferences ; 在新打开的对话框的左边的一列会看到一个名为Maven2的选项。鼠标单击,然后点击右边的Local Repository Folder ...

    maven安装maven安装maven安装maven安装maven安装

    maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装...

    Struts2 maven 完整实例

    在本实例中,我们将通过Maven来搭建一个完整的Struts2项目,探讨如何利用Maven管理和构建Struts2应用,并了解Struts2处理JSON数据的两种主要方法。 首先,Maven是Apache软件基金会开发的一款项目管理和集成工具,它...

    Maven 2 使用手册

    Maven 2 使用手册,chm中文格式。

Global site tag (gtag.js) - Google Analytics