如何在Maven中配置编码?


375

当我maven install在多模块Maven项目上运行时,我总是得到以下输出:

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

因此,我在Google上搜索了一下,但是我能找到的就是我必须添加:

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

...到我的pom.xml。但是它已经在那里(在父目录中pom.xml)。

配置<encoding>了Maven的资源-插件或Maven的编译器插件也不能解决问题。

所以有什么问题?


1
请注意,UTF-8编码实际上是您想要指定的编码。使用更简单的编码(例如ISO-8859-1(又名Latin-1)或什至是US-ASCII)可能会更好。
rmp

40
“是的,使用诸如……这样的简单编码可能会更好。”是的,还有错误最终用户以及其他开发人员……如今,最好尝试尽可能多地使用UTF-8并关心其他仅在向您抛出多编码应用程序要求时才进行编码。在这里,我们主要讨论源文件和配置文件的编码,用户输入的编码以不同的方式进行管理(使用'java -Dfile.encoding ...',并且进行了大量痛苦的编程工作)。
zakmck

我个人认为编码问题非常难以捉摸,以至于我在pom.xml中编码ASCII,然后将编码问题提前解决了。这自然是由我的名字从第1天:)给发布具有非ASCII字符提示
托尔比约恩Ravn的安德森

父pom.xml中设置了什么编码?
Ripon Al Wasim

Answers:


534

好的,我发现了问题。

我使用一些报告插件。在failsafe-maven-plugin的文档(http://maven.apache.org/plugins/maven-failsafe-plugin/integration-test-mojo.html)中,我发现该<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> <profile> <activation> <activeByDefault> true </ activeByDefault> </ activation> <id> local </ id> <properties> <url> earneventapi.intra1.e1.v2.epaas.aexp.com </ url > <project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding> <project.reporting.outputEncoding> UTF-8 </project.reporting .outputEncoding> </ properties> </ profile>
Bob Small

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

将2个属性添加到pom.xml文件的properties块时,这可以按预期工作。谢谢。
Jean Paul Ruiz

47

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

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

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

这仅在通过maven运行测试时可见(可能会在测试中打印这些常量的值。打印的scandic字母将显示为“ <?>”)。如果测试不正确,这会破坏类文件作为编译结果,并且未被注意。

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

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


由于这是JVM设置,而不是Maven,因此不确定是否有行之有效的方法。
Ville Myrskyneva

4
我认为您正在混淆。仅-Dfile.encoding当您在Java中使用I / O而未明确指定编码时才需要设置(不建议这样做)。我看不到这与Java源文件中的scandic字母有什么关系。project.build.sourceEncoding如Ethan Leroy的回答所述,正确设置Java源文件中的非ASCII可以与Maven一起使用。
sleske

@sleske我以为只要足够就可以了,但是当我第一次在这里结束并更改pom.xml时,它并没有解决我的问题。经过更多搜索和反复试验后,上述解决方案成功了。我认为发生这种情况的原因是因为maven调用了已安装/引用的JDK的javac,该javad又使用O / S编码作为默认值。如果有人知道在pom.xml中为javac调用指定编码的方法,则会以“行家方式”解决此问题。
Ville Myrskyneva

4
@VilleMyrskyneva:当Maven调用时javac,它将传递设置的编码project.build.sourceEncoding(您可以使用进行检查mvn -X),所以我看不到您所描述的是什么必要。如果您在项目中仍然遇到编码问题,请考虑将其作为一个单独的问题提出-看来您遇到了另一个问题。理想情况下,发布可重现的测试用例。
sleske 2015年

@sleske我在pom.xml中具有project.build.sourceEncoding,但是mvn测试仍然存在编码问题。而-Dfile.encoding = UTF8解决了该问题。我不明白为什么。stackoverflow.com/questions/42990644/...
蒂纳·

41

如果结合以上答案,最后看起来像是为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>

1
默认值似乎是$ {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
乔治Birbilis

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

7

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

  1. 设置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上检查文件编码,请执行以下操作:

$ file --mime F_PRDAUFT.dsv

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

希望这对某人有用。


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

6

尝试这个:

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

特别重要的是,我们不应忘记不仅源而且资源也需要此编码设置。
彼得-恢复莫妮卡

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.