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

375

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

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

Этан Леруа
источник
1
Будьте осторожны, кодировка UTF-8 - это то, что вы на самом деле хотите указать в качестве кодировки. Вам может быть лучше использовать более простую кодировку, такую ​​как ISO-8859-1 (она же Latin-1) или даже US-ASCII.
rmp
40
«Вам может быть лучше использовать более простую кодировку, такую ​​как…», да, и конечные пользователи ошибок, а также другие разработчики ... В настоящее время лучше всего стараться использовать UTF-8 как можно больше и заботиться о других кодировки только тогда, когда вам предъявляется требование к приложению с несколькими кодировками. Здесь мы говорим в основном о кодировании исходных файлов и файлов конфигурации, кодирование пользовательского ввода управляется по-другому (с 'java -Dfile.encoding ...' и с большим количеством болезненных усилий по программированию).
Закмк
Я лично решил, что проблемы с кодировкой были настолько неуловимыми, что я пошел на кодировку ASCII в pom.xml, а затем занялся вопросами кодирования заранее. Естественно, это связано с тем, что на моем имени был персонаж, не входящий в ASCII, что дает проблемы с первого дня :)
Торбьерн Равн Андерсен
Какая кодировка установлена ​​в родительском pom.xml?
Рипон Аль-Васим

Ответы:

535

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

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

Этан Леруа
источник
Поэтому у меня возникла эта проблема, и я добавил свойства, описанные выше, например: <profile> <profile> <активация> <activeByDefault> true </ activeByDefault> </ активации> <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>
Боб Смолл
Нет, единственная глобальная настройка кодирования должна выполняться env. переменная: stackoverflow.com/a/9976788/715269
Гангнус
Это работает должным образом при добавлении двух свойств в блок свойств файла pom.xml. Спасибо.
Жан Поль Руис
47

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

Если исходные файлы java содержат буквы scandic, они должны быть правильно интерпретированы 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).

Вилле Мырскинева
источник
Не уверен, есть ли способ maven сделать это, так как это настройка JVM, а не Maven.
Вилле Мырскинева
4
Я думаю, что вы все перепутали. Вам нужно только установить, -Dfile.encodingесли вы используете I / O в Java без явного указания кодировки (что не рекомендуется). Я не вижу, как это связано со скандальными буквами в исходных файлах Java. Non-ASCII в исходных файлах Java работает с Maven, если project.build.sourceEncodingон установлен правильно, как описано в ответе Итана Леруа.
слеске
@sleske Я бы предположил, что этого будет достаточно, но когда я впервые закончил здесь и внес изменения в pom.xml, это не решило мою проблему. После дополнительного поиска и после проб и ошибок описанное решение сработало. Я думаю, что причина того, что происходит, состоит в том, что maven вызывает javac установленного / переданного JDK, который в свою очередь использует кодировку O / S по умолчанию. Если кто-то знает способ указать кодировку для вызова javac в pom.xml, это решит проблему "maven way".
Вилле Мырскинева
4
@VilleMyrskyneva: Когда Maven вызывает javac, он передает кодировку, установленную project.build.sourceEncoding(вы можете проверить, используя mvn -X), поэтому я не вижу, как то, что вы описываете, необходимо. Если вы по-прежнему сталкиваетесь с проблемами кодирования в своем проекте, подумайте над тем, чтобы задать это как отдельный вопрос - похоже, вы столкнулись с другой проблемой. В идеале, опубликовать воспроизводимый контрольный пример.
Слёске
@sleske У меня есть project.build.sourceEncoding в pom.xml, но у mvn test все еще есть проблемы с кодировкой. в то время как это -Dfile.encoding = UTF8 решает это. Я не понимаю почему. stackoverflow.com/questions/42990644/…
Тийна
41

Если вы объедините ответы выше, наконец, 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>
bhdrk
источник
1
по умолчанию используется $ {project.build.sourceEncoding}, поэтому вам не нужно явно определять его для подключаемого модуля maven-resources (см. 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
Gangnus
7

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

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

Александр
источник
Нет, единственная глобальная настройка кодирования должна выполняться env. переменная: stackoverflow.com/a/9976788/715269
Гангнус
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>
fsimon
источник
Особенно важно, что мы не должны забывать, что не только источники, но и ресурсы нуждаются в этой настройке кодировки.
Петер - Восстановить Монику