ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Maven 中配置编码?

当我在我的多模块 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> 也不能修复它。

所以有什么问题?

请注意,UTF-8 编码是您实际要指定为编码的内容。您最好使用更简单的编码,例如 ISO-8859-1(又名 Latin-1)甚至 US-ASCII。
“您可能最好使用更简单的编码,例如......”是的,并且错误最终用户以及其他开发人员......现在最好尽可能多地尝试使用 UTF-8 并关心其他仅当向您抛出多编码应用程序要求时才进行编码。在这里,我们主要讨论的是源文件和配置文件的编码,用户输入的编码是不同的(使用'java -Dfile.encoding ...'并且有很多痛苦的编程工作)。
我个人认为编码问题是如此难以捉摸,所以我在 pom.xml 中编码 ASCII,然后把编码问题放在前面。这自然是因为我的名字中有一个非 ASCII 字符,从第一天开始就出现问题:)
父 pom.xml 中设置了什么编码?

N
Naman

好的,我找到了问题所在。

我使用一些报告插件。在 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


所以我遇到了这个问题,我从上面添加了这样的属性:<profiles> <简介> <激活> <默认激活>真</默认激活> </激活> <id>本地</id> <属性> <网址>earneventapi.intra1.e1.v2.epaas.aexp.com</url> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </属性> </简介>
不,编码的唯一全局设置是由 env 完成的。变量:stackoverflow.com/a/9976788/715269
这在将 2 个属性添加到 pom.xml 文件的属性块时按预期工作。谢谢。
SET MAVEN_OPTS=-Dfile.encoding=utf-8 或 unix 之类的 export MAVEN_OPTS=-Dfile.encoding=utf-8 是唯一正确的答案... ;-)
V
Ville Myrskyneva

如果有人遇到上述解决方案无法解决的扫描字母问题,这将是对以前的补充。

如果 Java 源文件包含扫描字母,则它们需要被用于编译的 Java 正确解释。 (例如常量中使用的字母)

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

这将仅通过 maven 运行测试可见(可能在测试中打印这些常量的值。打印的扫描字母将显示为 '< ?>')如果没有正确测试,这将破坏类文件作为编译结果并被忽视了。

为防止这种情况,您必须将用于编译的 Java 设置为使用 UTF-8 编码。 maven pom.xml里面有编码设置是不够的,需要设置环境变量:JAVA_TOOL_OPTIONS = -Dfile.encoding=UTF8

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


不确定是否有 Maven 方法可以做到这一点,因为这是 JVM 设置,而不是 Maven。
我认为你把事情搞混了。如果您在 Java 中使用 I/O 而不明确指定编码(不推荐),则只需设置 -Dfile.encoding。我看不出这与 Java 源文件中的扫描字母有什么关系。如 Ethan Leroy 的回答中所述,正确设置 project.build.sourceEncoding 时,Java 源文件中的非 ASCII 可与 Maven 一起使用。
@sleske 我认为同样的就足够了,但是当我第一次在这里结束并进行 pom.xml 更改时,它并没有解决我的问题。经过更多的搜索和反复试验后,所描述的解决方案奏效了。我认为发生这种情况的原因是因为 maven 调用了已安装/引用的 JDK 的 javac,而后者又默认使用 O/S 编码。如果有人知道在 pom.xml 中为 javac 调用指定编码的方法,将以“maven 方式”解决此问题。
@VilleMyrskyneva:当 Maven 调用 javac 时,它将传递 project.build.sourceEncoding 设置的编码(您可以使用 mvn -X 检查),所以我看不出您所描述的内容是必要的。如果您在项目中仍然遇到编码问题,请考虑将其作为一个单独的问题提出——您似乎遇到了另一个问题。理想情况下,发布一个可重现的测试用例。
@sleske 我在 pom.xml 中有 project.build.sourceEncoding,但是 mvn test 仍然有编码问题。而 -Dfile.encoding=UTF8 解决了它。我不明白为什么。 stackoverflow.com/questions/42990644/…
b
bhdrk

如果结合上面的答案,最终配置为 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>

默认值似乎是 ${project.build.sourceEncoding},因此您不需要为 maven-resources-plugin 显式定义它(请参阅 maven.apache.org/plugins/maven-resources-plugin/examples/…maven.apache.org/plugins/maven-resources-plugin/…maven.apache.org/general.html#encoding-warning
不,编码的唯一全局设置是由 env 完成的。变量:stackoverflow.com/a/9976788/715269
A
Alexandr

人们似乎将内容编码与内置文件/资源编码混合在一起。只有 Maven 属性是不够的。 -Dfile.encoding=UTF8 无效。为避免出现编码问题,您应遵循以下简单规则

设置maven编码,如上所述:

UTF-8 UTF-8

在代码中处理文件、字符串、IO 时,始终明确设置编码。如果您不遵循此规则,您的应用程序将依赖于环境。 -Dfile.encoding=UTF8 正是负责运行时环境配置,但我们不应该依赖它。如果您有数千个客户端,那么配置系统并因此发现问题需要更多的努力。你只是对它有一个额外的依赖,你可以通过显式设置它来避免。 Java 中大多数使用默认编码的方法都因此被标记为已弃用。确保您正在使用的内容也采用您期望的相同编码。如果不是,前面的步骤无关紧要!例如,如果文件的编码不是 UTF8 但您期望它,则不会正确处理文件。在 Linux 上检查文件编码:

$ 文件 --mime F_PRDAUFT.dsv

强制客户端/服务器在请求/响应中显式设置编码,以下是示例:

@Produces("application/json; charset=UTF-8") @Consumes("application/json; charset=UTF-8")

希望这对某人有用。


不,编码的唯一全局设置是由 env 完成的。变量:stackoverflow.com/a/9976788/715269
f
fsimon

尝试这个:

<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>

特别重要的是,我们不应该忘记,不仅来源,而且资源都需要这种编码设置。
i
isapir

就我而言,我使用的是 maven-dependency-plugin,因此为了解决该问题,我必须添加以下属性:

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

请参阅Apache Maven Resources Plugin / Specifying a character encoding scheme