在Maven中配置字符编码的教程

740 阅读2分钟

有时,用maven编译的java文件或构建的war文件会出现如下的编码错误:

  • 文件编码未设置,使用平台编码UTF-8,即构建依赖于平台!
  • maven字符编码源不工作

maven读取源代码用于构建和安装工件,所以它应该定义字符编码,以读写不同编码类型的文件--ASCII、UTF-8或UTF-16,maven使用运行平台的默认编码,即ISO-8859-1。

本帖帮助开发者解决maven的字符编码问题。

我们有多种方法可以在maven项目中配置编码。

你可以查看我关于maven命令的其他帖子

你可以在pom.xml中定义project.build.sourceEncoding project.reporting.outputEncoding等属性,以便在应用程序层面设置编码。

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

这种方法的好处是,你不需要为你使用的每个插件手动定义编码。

一旦这个编码被定义,所有的插件都会重复使用这个配置

将maven资源插件的编码改为UTF-8

资源插件的编码可以通过配置以下属性来固定

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

或者你也可以在属性中添加project.build.sourceEncodingUTF-8

配置命令行maven选项

需要通过命令行运行maven目标,因此我们必须使用-D选项或MAVEN_OPTS环境变量。

maven的-D选项用于设置环境变量,我们可以使用下面描述的编码相关属性。

mvn -Dproject.build.sourceEncoding=UTF-8

set "MAVEN_OPTS=-Duser.language=fr -Dfile.encoding=UTF-8"
set MAVEN_OPTS= -Dfile.encoding=UTF-8

maven编译器插件中的编码

编译器插件是一个用于编译java源文件的插件,这意味着如果源文件中存在任何字符,你可能会遇到编码问题。

以下是我们在maven编译器插件中设置字符编码为UTF-8的方法。


<plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.6.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
</plugins>

如何改变maven测试的编码?

当你编译和测试java类时,你可能会因为某行代码中有UTF-8字符而出现编码问题。

Maven测试是通过maven sure fire插件运行的,因此你必须用配置选项--argLine来配置该插件。

这样,sure fire插件就能读取所有UTF-8编码的文件。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>-Dfile.encoding=UTF-8</argLine>
    </configuration>
</plugin>

结论

如上所述,将字符编码从默认改为UTF-8涉及全局层面、插件或命令行层面,也请以不同方式更新maven标准属性,如Dfile.encoding,project.build.sourceEncodingproject.reporting.outputEncoding

希望你喜欢这篇文章:-)并请分享。