Jak skonfigurować kodowanie w Maven?

375

Kiedy uruchamiam maven installprojekt maven z wieloma modułami, zawsze otrzymuję następujące dane wyjściowe:

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

Więc trochę googlowałem, ale wszystko, co mogę znaleźć, to to, że muszę dodać:

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

... do mojego pom.xml. Ale już tam jest (u rodzica pom.xml).

Konfigurowanie <encoding>wtyczki maven-resources-plugin lub wtyczki maven-compiler również nie naprawia tego.

Więc w czym problem?

Ethan Leroy
źródło
1
Uważaj, aby kodowanie UTF-8 było tym, co faktycznie chcesz określić jako kodowanie. Lepiej będzie użyć prostszego kodowania, takiego jak ISO-8859-1 (aka Latin-1) lub nawet US-ASCII.
rmp
40
„Lepiej będzie użyć prostszego kodowania, takiego jak ...” tak, i użytkownicy końcowi błędów, a także inni programiści… W dzisiejszych czasach najlepiej jest używać UTF-8 w jak największym stopniu i dbać o inne kodowanie tylko wtedy, gdy zostanie ci zgłoszone wymaganie aplikacji obsługującej wiele kodowań. Mówimy tutaj głównie o kodowaniu plików źródłowych i konfiguracyjnych, kodowanie danych wejściowych użytkownika jest zarządzane w różny sposób (za pomocą „java -Dfile.encoding ...” i przy dużym wysiłku programistycznym).
zakmck,
Ja osobiście zdecydowałem, że problemy z kodowaniem są tak nieuchwytne, że poszedłem do kodowania ASCII w pom.xml, a następnie wziąłem sprawy kodowania na wierzch. Jest to naturalnie podyktowane tym, że w moim imieniu występuje postać spoza ASCII, która daje problemy od pierwszego dnia :)
Thorbjørn Ravn Andersen
Jakie kodowanie jest ustawione w nadrzędnym pliku pom.xml?
Ripon Al Wasim

Odpowiedzi:

534

OK, znalazłem problem.

Korzystam z niektórych wtyczek raportujących. W dokumentacji wtyczki failafe-maven-plugin ( http://maven.apache.org/plugins/maven-failsafe-plugin/integration-test-mojo.html ) stwierdziłem, że <encoding>konfiguracja - oczywiście - używa ${project.reporting.outputEncoding}domyślnie . Dodałem więc właściwość jako element potomny projectelementu i wszystko jest teraz w porządku:

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

Zobacz też http://maven.apache.org/general.html#encoding-warning

Ethan Leroy
źródło
Miałem więc ten problem i dodałem właściwości z powyższego: <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
Nie, jedynym globalnym ustawieniem kodowania jest env. zmienna: stackoverflow.com/a/9976788/715269
Gangnus
Działa to zgodnie z oczekiwaniami podczas dodawania 2 właściwości do bloku właściwości pliku pom.xml. Dzięki.
Jean Paul Ruiz,
47

Byłoby to dodatkiem do poprzedniego, jeśli ktoś napotka problem ze skandalicznymi literami, który nie został rozwiązany za pomocą powyższego rozwiązania.

Jeśli pliki źródłowe Java zawierają skandynawskie litery, muszą zostać poprawnie zinterpretowane przez język Java używany do kompilacji . (np. skandynawskie litery używane w stałych)

Nawet jeśli pliki są przechowywane w UTF-8, a Maven jest skonfigurowany do używania UTF-8, System Java używany przez Maven nadal będzie używał domyślnych ustawień systemu (np. W Windows: cp1252).

Będzie to widoczne tylko podczas uruchamiania testów za pomocą maven (możliwe wydrukowanie wartości tych stałych w testach. Wydrukowane skandynawskie litery byłyby pokazane jako „<?>”). Nieprawidłowe przetestowanie spowodowałoby uszkodzenie plików klasy jako wyniku kompilacji i pozostawiony niezauważony.

Aby temu zapobiec, musisz ustawić Javę używaną do kompilacji, aby używała kodowania UTF-8. Nie wystarczy mieć ustawienia kodowania w maven pom.xml, musisz ustawić zmienną środowiskową: JAVA_TOOL_OPTIONS = -Dfile.encoding = UTF8

Ponadto, jeśli używasz Eclipse w systemie Windows, może być konieczne ustawienie dodatkowo kodowania (jeśli uruchamiasz indywidualny test przez Eclipse).

Ville Myrskyneva
źródło
Nie jestem pewien, czy jest na to dobry sposób, ponieważ jest to ustawienie JVM, a nie Maven.
Ville Myrskyneva
4
Myślę, że mieszasz różne rzeczy. Musisz tylko ustawić, -Dfile.encodingjeśli używasz I / O w Javie bez wyraźnego określenia kodowania (co nie jest zalecane). Nie widzę, co to ma wspólnego ze skandalicznymi literami w plikach źródłowych Java. Pliki inne niż ASCII w plikach źródłowych Java działają z Maven, jeśli project.build.sourceEncodingsą ustawione poprawnie, jak opisano w odpowiedzi Ethana Leroya.
sleske,
@sleske Zakładam, że to samo wystarczy, ale kiedy po raz pierwszy skończyłem tutaj i wprowadziłem zmiany w pom.xml, nie rozwiązało to mojego problemu. Po dalszych poszukiwaniach i próbach i błędach opisane rozwiązanie zadziałało. Myślę, że powodem tego jest to, że maven nazywa javac zainstalowanego / poleconego JDK, który z kolei używa domyślnie kodowania O / S. Jeśli ktoś zna sposób na określenie kodowania wywołania javac w pom.xml rozwiązałby ten problem w „maven way”.
Ville Myrskyneva
4
@VilleMyrskyneva: Gdy Maven javacwywoła, przekaże kodowanie ustawione przez project.build.sourceEncoding(możesz to sprawdzić za pomocą mvn -X), więc nie rozumiem, jak to, co opisujesz, jest konieczne. Jeśli nadal występują problemy z kodowaniem w swoim projekcie, rozważ zadanie go jako osobnego pytania - wygląda na to, że napotykasz inny problem. Idealnie, opublikuj odtwarzalny przypadek testowy.
sleske
@sleske Mam project.build.sourceEncoding w pom.xml, ale test mvn nadal ma problem z kodowaniem. podczas gdy to -Dfile.encoding = UTF8 rozwiązuje to. Nie rozumiem dlaczego. stackoverflow.com/questions/42990644/…
Tiina
41

Jeśli połączysz powyższe odpowiedzi, w końcu powinien wyglądać plik pom.xml skonfigurowany dla 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
źródło
1
domyślnie wydaje się to $ {project.build.sourceEncoding}, więc nie powinno być potrzeby jawnego definiowania go dla wtyczki maven-resources-plugin (patrz maven.apache.org/plugins/maven-resources-plugin/examples/... , maven.apache.org/plugins/maven-resources-plugin/… , maven.apache.org/general.html#encoding-warning )
George Birbilis
Nie, jedynym globalnym ustawieniem kodowania jest env. zmienna: stackoverflow.com/a/9976788/715269
Gangnus
7

Wygląda na to, że ludzie mieszają kodowanie treści z wbudowanym kodowaniem plików / zasobów. Posiadanie tylko właściwości maven nie wystarczy. Mając na -Dfile.encoding=UTF8nie skuteczne. Aby uniknąć problemów z kodowaniem, należy przestrzegać następujących prostych zasad

  1. Ustaw kodowanie maven, jak opisano powyżej:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  1. Zawsze ustawiaj kodowanie jawnie, gdy pracujesz z plikami, łańcuchami, IO w swoim kodzie. Jeśli nie zastosujesz się do tej reguły, Twoja aplikacja zależy od środowiska. -Dfile.encoding=UTF8Dokładnie jest odpowiedzialny za konfigurację środowiska run-time, ale nie powinno zależeć od niego. Jeśli masz tysiące klientów, konfigurowanie systemów i znajdowanie problemów z tego powodu wymaga więcej wysiłku. Masz tylko dodatkową zależność, której możesz uniknąć, ustawiając go jawnie. Większość metod w Javie, które używają domyślnego kodowania, są z tego powodu oznaczone jako przestarzałe.

  2. Upewnij się, że zawartość, z którą pracujesz, jest również w tym samym kodowaniu, czego oczekujesz. Jeśli tak nie jest, poprzednie kroki nie mają znaczenia! Na przykład plik nie zostanie poprawnie przetworzony, jeśli jego kodowanie nie jest zgodne z UTF8, ale można się tego spodziewać. Aby sprawdzić kodowanie plików w systemie Linux:

plik $ --mime F_PRDAUFT.dsv

  1. Wymuś jawne kodowanie zestawów klientów / serwerów w żądaniach / odpowiedziach, oto przykłady:
@Produces("application/json; charset=UTF-8")
@Consumes("application/json; charset=UTF-8")

Mam nadzieję, że będzie to dla kogoś przydatne.

Alexandr
źródło
Nie, jedynym globalnym ustawieniem kodowania jest env. zmienna: stackoverflow.com/a/9976788/715269
Gangnus
6

Spróbuj tego:

<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
źródło
Szczególnie ważne nie powinniśmy zapominać, że nie tylko źródła, ale także zasoby potrzebują tego ustawienia kodowania.
peterh - Przywróć Monikę