Как настроить кодировку в Maven?

Когда я запускаю 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 или maven-compiler-plugin также не исправляет это.

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


person Ethan Leroy    schedule 10.06.2010    source источник
comment
Будьте осторожны: кодировка UTF-8 - это то, что вы действительно хотите указать в качестве кодировки. Возможно, вам будет лучше использовать более простую кодировку, такую ​​как ISO-8859-1 (она же Latin-1) или даже US-ASCII.   -  person rmp    schedule 14.01.2013
comment
Возможно, вам будет лучше использовать более простую кодировку, такую ​​как ... да, и конечные пользователи с ошибками, а также другие разработчики ... В настоящее время лучше попытаться использовать UTF-8 как можно чаще и заботиться только о других кодировках когда вам предъявляют требования к приложению с несколькими кодировками. Здесь мы говорим в основном о кодировании исходных файлов и файлов конфигурации, кодирование пользовательского ввода управляется по-другому (с помощью 'java -Dfile.encoding ...' и с большим количеством болезненных усилий по программированию).   -  person zakmck    schedule 23.08.2013
comment
Я лично решил, что проблемы с кодировкой были настолько неуловимыми, что я пошел на кодирование ASCII в pom.xml, а затем решил проблемы с кодировкой заранее. Это, естественно, вызвано наличием в моем имени символа, отличного от ASCII, из-за чего возникают проблемы с первого дня :)   -  person Thorbjørn Ravn Andersen    schedule 09.05.2014
comment
Какая кодировка установлена ​​в родительском pom.xml?   -  person Ripon Al Wasim    schedule 15.05.2015


Ответы (6)


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

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

person Ethan Leroy    schedule 10.06.2010
comment
Нет, единственная глобальная настройка кодирования должна выполняться env. переменная: stackoverflow.com/a/9976788/715269 - person Gangnus; 09.03.2020
comment
Это работает, как ожидалось, при добавлении 2 свойств в блок свойств файла pom.xml. Спасибо. - person jpruiz114; 05.04.2020
comment
SET MAVEN_OPTS = -Dfile.encoding = utf-8 или unix, например, export MAVEN_OPTS = -Dfile.encoding = utf-8 - единственный правильный ответ ... ;-) - person udoline; 16.04.2021

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

Если исходные файлы 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).

person Ville Myrskyneva    schedule 12.02.2015
comment
Не уверен, есть ли способ сделать это maven, поскольку это настройка JVM, а не Maven. - person Ville Myrskyneva; 02.04.2015
comment
Я думаю, вы что-то путаете. Вам нужно установить -Dfile.encoding только в том случае, если вы используете ввод-вывод в Java без явного указания кодировки (что не рекомендуется). Я не понимаю, при чем тут скандальные буквы в исходных файлах Java. Не-ASCII в исходных файлах Java работает с Maven, если project.build.sourceEncoding установлен правильно, как описано в ответе Итана Лероя. - person sleske; 07.07.2015
comment
@sleske Я бы предположил, что того же будет достаточно, но когда я впервые закончил здесь и внес изменения в pom.xml, это не устранило мою проблему. После дополнительных поисков и после проб и ошибок описанное решение сработало. Я думаю, что причина того, что происходит, заключается в том, что maven вызывает javac установленного / указанного JDK, который, в свою очередь, по умолчанию использует кодировку O / S. Если кто-то знает способ указать кодировку для вызова javac в pom.xml, это решит эту проблему способом maven. - person Ville Myrskyneva; 01.10.2015
comment
@VilleMyrskyneva: Когда Maven вызывает javac, он передает кодировку, установленную project.build.sourceEncoding (вы можете проверить с помощью mvn -X), поэтому я не понимаю, насколько необходимо то, что вы описываете. Если у вас все еще возникают проблемы с кодировкой в ​​вашем проекте, подумайте о том, чтобы задать это как отдельный вопрос - похоже, вы столкнулись с другой проблемой. В идеале разместите воспроизводимый тестовый пример. - person sleske; 01.10.2015
comment
@sleske У меня есть project.build.sourceEncoding в pom.xml, но у mvn test все еще есть проблема с кодировкой. в то время как этот -Dfile.encoding = UTF8 решает эту проблему. Не понимаю почему. stackoverflow.com/questions/42990644/ - person Tiina; 24.03.2017
comment
IDEA в windows не нужно указывать как таковую при тестировании. Не знаю почему - person Tiina; 24.03.2017

Если вы объедините приведенные выше ответы, наконец, 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>
person bhdrk    schedule 29.06.2016
comment
по умолчанию используется $ {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) - person George Birbilis; 30.05.2018
comment
Нет, единственная глобальная настройка кодирования должна выполняться env. переменная: stackoverflow.com/a/9976788/715269 - person Gangnus; 09.03.2020

Кажется, люди смешивают кодировку контента со встроенной кодировкой файлов / ресурсов. Недостаточно иметь только свойства maven. Наличие -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")

Надеюсь, это будет кому-то полезно.

person Alexandr    schedule 13.02.2019
comment
Нет, единственная глобальная настройка кодирования должна выполняться env. переменная: stackoverflow.com/a/9976788/715269 - person Gangnus; 09.03.2020

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

<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>
person fsimon    schedule 17.04.2016
comment
Что особенно важно, мы не должны забывать, что не только источники, но и ресурсы нуждаются в этой настройке кодировки. - person peterh; 23.03.2017

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

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

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

person isapir    schedule 17.02.2018