如何在 Maven 中配置编码?

问题描述 投票:0回答:7

当我在多模块 Maven 项目上运行

maven install
时,我总是得到以下输出:

[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!

所以,我用谷歌搜索了一下,但我能找到的只是我必须添加:

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

...到我的 pom.xml。但它已经在那里了(在父级

pom.xml
中)。

为 maven-resources-plugin 或 maven-compiler-plugin 配置

<encoding>
也无法解决此问题。

那么问题出在哪里?

java maven encoding maven-2 maven-3
7个回答
743
投票

好的,我找到问题了。

我使用一些报告插件。在

failsafe-maven-plugin
的文档中,我发现
<encoding>
配置 - 当然 - 默认使用
${project.reporting.outputEncoding}

所以我将该属性添加为

project
元素的子元素,现在一切都很好:

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

另请参阅 http://maven.apache.org/general.html#encoding-warning


64
投票

如果有人遇到了上述解决方案无法解决的 Scandic 字母问题,这将是对之前内容的补充。

如果 Java 源文件包含 Scandic 字母,则需要由 用于编译的 Java 正确解释它们。 (例如常量中使用的斯堪迪克字母)

即使文件以 UTF-8 存储并且 Maven 配置为使用 UTF-8,Maven 使用的系统 Java 仍将使用系统默认值(例如,在 Windows 中:cp1252)。

这仅在通过 maven 运行测试时可见(可能在测试中打印这些常量的值。打印的 Scandic 字母将显示为“

”) 如果没有正确测试,这会破坏类文件作为编译结果并且被忽视。< ?>

为了防止这种情况,您必须将

用于编译的Java设置为使用UTF-8编码。 仅仅在maven pom.xml中设置编码是不够的,还需要设置环境变量: JAVA_TOOL_OPTIONS = -Dfile.encoding=UTF8

此外,如果在 Windows 中使用 Eclipse,您可能还需要设置除此之外使用的编码(如果您通过 eclipse 运行单独的测试)。


58
投票
如果结合上面的答案,最终配置为 UTF-8 的 pom.xml 应该是这样的。

pom.xml

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>YOUR_COMPANY</groupId> <artifactId>YOUR_APP</artifactId> <version>1.0.0-SNAPSHOT</version> <properties> <project.java.version>1.8</project.java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <dependencies> <!-- Your dependencies --> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <source>${project.java.version}</source> <target>${project.java.version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> <configuration> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> </plugins> </build> </project>
    

9
投票
人们似乎将内容编码与内置文件/资源编码混合在一起。仅拥有 Maven 属性是不够的。有

-Dfile.encoding=UTF8

 没有效果。为了避免出现编码问题,您应该遵循以下简单规则

    设置maven编码,如上所述:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>


  1. 在代码中处理文件、字符串、IO 时,始终显式设置编码。如果您不遵循此规则,您的应用程序将取决于环境。

    -Dfile.encoding=UTF8

     正是负责运行时环境配置,但我们不应该依赖它。如果您有数千个客户端,则需要花费更多精力来配置系统并查找问题。您只是对它有额外的依赖,您可以通过显式设置它来避免这种依赖。 Java 中使用默认编码的大多数方法都因此被标记为已弃用。

  2. 确保您正在使用的内容也采用您期望的相同编码。如果不是,前面的步骤就没有关系了!例如,如果文件的编码不是 UTF8 但您期望它,则该文件将无法正确处理。在 Linux 上检查文件编码:

$ 文件 --mime F_PRDAUFT.dsv

    强制客户端/服务器在请求/响应中显式设置编码,以下是示例:
@Produces("application/json; charset=UTF-8") @Consumes("application/json; charset=UTF-8")


希望这对某人有用。


8
投票
试试这个:

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

1
投票
就我而言,我使用的是

maven-dependency-plugin

,因此为了解决该问题,我必须添加以下属性:

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

请参阅

Apache Maven 资源插件/指定字符编码方案


1
投票
(截至2023年,但实际上一直如此)

如果您使用 Spring Boot, 你什么都不用做。

它已经应用于父级此类属性

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

一般情况下,上面这两行就足够了。 并且您不应该添加任何其他位置或插件,除非您知道自己在做什么。

如果您看到采取更多措施的建议,很可能它已经过时了。

© www.soinside.com 2019 - 2024. All rights reserved.