Как настроить кодировку в Maven? - PullRequest
325 голосов
/ 10 июня 2010

Когда я запускаю maven install в моем многомодульном проекте maven, я всегда получаю следующий вывод:

[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).

Настройка <encoding> для плагина maven-resources-plugin или maven-compiler-plugin также не исправляет это.

Так в чем же проблема?

Ответы [ 6 ]

480 голосов
/ 11 июня 2010

ОК, я нашел проблему.

Я использую некоторые плагины для отчетов. В документации по отказоустойчивому подключаемому модулю (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

41 голосов
/ 12 февраля 2015

Это было бы в дополнение к предыдущему, если кто-то встречает проблему со скандинавскими буквами, которая не решена с помощью решения выше.

Если исходные файлы java содержат буквы скандинавского характера, их необходимо правильно интерпретировать с помощью Java, используемого для компиляции . (например, скандальные буквы, используемые в константах)

Даже если файлы хранятся в UTF-8 и Maven настроен на использование UTF-8, системная Java, используемая Maven, все равно будет использовать системную настройку по умолчанию (например, в Windows: cp1252).

Это будет видно только при выполнении тестов через maven (возможно, печать значений этих констант в тестах. Напечатанные буквы скандинава будут отображаться как «<?>») Если не проверить должным образом, это повредит файлы классов в результате компиляции и останется незамеченным.

Чтобы предотвратить это, вы должны установить Java, используемый для компиляции , для использования кодировки UTF-8. Недостаточно иметь настройки кодировки в файле maven pom.xml, вам нужно установить переменную окружения: JAVA_TOOL_OPTIONS = -Dfile.encoding = UTF8

Также, если вы используете Eclipse в Windows, вам может потребоваться установить кодировку, используемую в дополнение к этому (если вы запускаете отдельный тест через eclipse).

33 голосов
/ 29 июня 2016

Если вы объедините ответы, приведенные выше, наконец, pom.xml, настроенный для UTF-8, должен выглядеть следующим образом.

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>
5 голосов
/ 18 апреля 2016

Попробуйте это:

<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 голос
/ 18 февраля 2018

В моем случае я использовал maven-dependency-plugin, поэтому для решения этой проблемы мне пришлось добавить следующее свойство:

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

См. Плагин Apache Maven Resources / Указание кодировки символовсхема

0 голосов
/ 13 февраля 2019

Кажется, что люди смешивают кодировку контента со встроенной кодировкой файлов / ресурсов. Иметь только мавенские свойства недостаточно. Наличие -Dfile.encoding=UTF8 не эффективно. Чтобы избежать проблем с кодировкой, вы должны следовать следующим простым правилам

  1. Установите кодировку maven, как описано выше:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  1. Всегда устанавливайте кодировку явно, когда работаете с файлами, строками, вводом-выводом в вашем коде. Если вы не будете следовать этому правилу, ваше приложение будет зависеть от среды. -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")

Надеюсь, это кому-нибудь пригодится.

...