Як налаштувати кодування в 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 або maven-компілятора також не виправляє.

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


1
Будьте уважні, що кодування UTF-8 - це те, що ви насправді хочете вказати як кодування. Можливо, вам буде краще скористатися більш простим кодуванням, таким як ISO-8859-1 (він же Latin-1) або навіть US-ASCII.
rmp

40
"Можливо, вам буде краще скористатися більш простим кодуванням, таким як ..." Так, і помилками кінцевих користувачів, а також іншими розробниками ... Сьогодні найкраще спробувати використовувати UTF-8 якомога більше і піклуватися про інших кодування тільки тоді, коли вам передано вимогу щодо багатокодування. Тут ми говоримо здебільшого про кодування вихідних та конфігураційних файлів, кодування вводу користувача керується по-різному (з 'java -Dfile.encoding ...' та з великою кількістю болісних зусиль програмування).
zakmck

Я особисто вирішив, що проблеми кодування були настільки невловимими, що я пішов на кодування ASCII у pom.xml, а потім перейняв проблеми кодування наперед. Це, природно, підказує, що в моєму імені є символ, який не належить до ASCII, і видає питання з 1-го дня :)
Thorbjørn Ravn Andersen

Яке кодування встановлено у батьківському pom.xml?
Ріпон Аль Васім

Відповіді:


535

Гаразд, я знайшов проблему.

Я використовую деякі додатки для звітування. У документації про модуль failsafe-maven ( 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 </ull > <project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding> <project.reporting.outputEncoding> UTF-8 </project.reporting .outputEncoding> </properties> </profile>
Боб Малий

Ні, єдиний глобальний параметр кодування повинен бути зроблений env. Змінні: stackoverflow.com/a/9976788/715269
Гангнус

Це працює, як очікувалося, додаючи 2 властивості до блоку властивостей файлу pom.xml. Дякую.
Жан Пол Руїс

47

Це було б на додаток до попереднього, якщо хтось стикається з проблемою зі скандальними літерами, яка не вирішена з рішенням вище.

Якщо у вихідних файлах 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).


Не впевнений, чи існує спосіб зробити це Maven, оскільки це налаштування JVM, а не Maven.
Віль Мерскінева

4
Я думаю, ви змішуєте речі. Вам потрібно встановити лише -Dfile.encodingякщо ви використовуєте I / O в Java, не чітко вказуючи кодування (що не рекомендується). Я не бачу, що це стосується скандальних літер у вихідних файлах Java. Non-ASCII у вихідних файлах Java працює з Maven, якщо project.build.sourceEncodingвстановлено правильно, як описано у відповіді Ітана Леруя.
sleske

@sleske я б припустив, що того ж буде достатньо, але коли я вперше закінчився тут і змінив pom.xml, це не вирішило моєї проблеми. Після додаткового пошуку та після спроб та помилок описане рішення спрацювало. Я думаю, що причина цього відбувається в тому, що maven викликає javac встановленого / згаданого JDK, який, в свою чергу, використовує кодування O / S як стандартне. Якщо хтось знає спосіб вказати кодування для виклику javac у pom.xml, вирішив би цю проблему "maven way".
Віль Мерскінева

4
@VilleMyrskyneva: Коли Maven викликає javac, вона пройде уздовж кодування, встановленого project.build.sourceEncoding(можна перевірити, використовуючи mvn -X), тому я не бачу, як потрібно те, що ви описуєте. Якщо у вас все ще виникають проблеми з кодуванням у вашому проекті, розгляньте це як окреме запитання - здається, ви стикаєтеся з іншою проблемою. В ідеалі розмістіть тестовий зразок, що відтворюється
sleske

@sleske У мене projekt.build.sourceEncoding в pom.xml, але mvn тест все ще має проблеми з кодуванням. тоді як це -Dfile.encoding = UTF8 вирішує це. Я не розумію, чому. stackoverflow.com/questions/42990644/…
Тіна

41

Якщо ви комбінуєте відповіді вище, нарешті, таким чином повинен виглядати пом.xml, налаштований на UTF-8.

пом.хмл

<?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 (див. 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
Гангнус

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

Особливо важливо, не слід забувати, що не тільки джерела, але й ресурси потребують цього параметра кодування.
peterh

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.