Wie konfiguriere ich die Codierung in Maven?

375

Wenn ich maven installmein Multi-Module-Maven-Projekt ausführe, erhalte ich immer die folgende Ausgabe:

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

Also habe ich ein bisschen gegoogelt, aber alles was ich finden kann ist, dass ich hinzufügen muss:

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

... zu meiner pom.xml. Aber es ist schon da (beim Elternteil pom.xml).

Die Konfiguration <encoding>für das Maven-Resources-Plugin oder das Maven-Compiler-Plugin behebt das Problem ebenfalls nicht.

Also, was ist das Problem?

Ethan Leroy
quelle
1
Achten Sie darauf, dass Sie die UTF-8-Codierung tatsächlich als Codierung angeben möchten. Möglicherweise ist es besser, eine einfachere Codierung wie ISO-8859-1 (auch bekannt als Latin-1) oder sogar US-ASCII zu verwenden.
rmp
40
"Möglicherweise ist es besser, eine einfachere Codierung wie ... zu verwenden." Ja, und Fehler-Endbenutzer sowie andere Entwickler ... Heutzutage ist es am besten, UTF-8 so oft wie möglich zu verwenden und sich um andere zu kümmern Codierungen nur, wenn eine Anwendungsanforderung für mehrere Codierungen an Sie gesendet wird. Hier geht es hauptsächlich um die Codierung von Quell- und Konfigurationsdateien, die Codierung von Benutzereingaben wird unterschiedlich verwaltet (mit 'java -Dfile.encoding ...' und mit viel schmerzhaftem Programmieraufwand).
Zakmck
Ich persönlich entschied, dass die Codierungsprobleme so schwer zu lösen waren, dass ich mich für die Codierung von ASCII in pom.xml entschied und dann die Codierungsprobleme in den Vordergrund stellte. Dies wird natürlich dadurch veranlasst, dass ich in meinem Namen einen Nicht-ASCII-Charakter habe, der vom ersten Tag an Probleme verursacht :)
Thorbjørn Ravn Andersen
Welche Codierung ist in der übergeordneten Datei pom.xml festgelegt?
Ripon Al Wasim

Antworten:

535

OK, ich habe das Problem gefunden.

Ich verwende einige Berichts-Plugins. In der Dokumentation des fehlersicheren Maven-Plugins ( http://maven.apache.org/plugins/maven-failsafe-plugin/integration-test-mojo.html ) habe ich festgestellt, dass die <encoding>Konfiguration - natürlich - ${project.reporting.outputEncoding}standardmäßig verwendet wird . Also habe ich die Eigenschaft als untergeordnetes Element des projectElements hinzugefügt und jetzt ist alles in Ordnung:

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

Siehe auch http://maven.apache.org/general.html#encoding-warning

Ethan Leroy
quelle
Also hatte ich dieses Problem und fügte die Eigenschaften von oben wie folgt hinzu: <profiles> <profile> <activation> <activeByDefault> true </ activeByDefault> </ activity> <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> </ property> </ profile>
Bob Small
Nein, die einzige globale Einstellung der Codierung muss von env vorgenommen werden. Variable: stackoverflow.com/a/9976788/715269
Gangnus
Dies funktioniert wie erwartet, während die beiden Eigenschaften zum Eigenschaftenblock der Datei pom.xml hinzugefügt werden. Vielen Dank.
Jean Paul Ruiz
47

Dies wäre zusätzlich zu den vorherigen, wenn jemand auf ein Problem mit skandischen Buchstaben stößt, das mit der obigen Lösung nicht gelöst werden kann.

Wenn die Java-Quelldateien skandische Buchstaben enthalten, müssen sie von dem zum Kompilieren verwendeten Java korrekt interpretiert werden . (zB skandische Buchstaben in Konstanten)

Selbst wenn die Dateien in UTF-8 gespeichert sind und der Maven für die Verwendung von UTF-8 konfiguriert ist, verwendet das vom Maven verwendete System Java weiterhin den Systemstandard (z. B. in Windows: cp1252).

Dies ist nur sichtbar, wenn die Tests über Maven ausgeführt werden (möglicherweise werden die Werte dieser Konstanten in Tests gedruckt. Die gedruckten Skandalbuchstaben werden als '<?>' Angezeigt). Wenn sie nicht ordnungsgemäß getestet werden, werden die Klassendateien als Kompilierungsergebnis beschädigt unbemerkt gelassen.

Um dies zu verhindern, müssen Sie das zum Kompilieren verwendete Java für die Verwendung der UTF-8-Codierung festlegen . Es reicht nicht aus, die Codierungseinstellungen in der maven pom.xml zu haben. Sie müssen die Umgebungsvariable festlegen: JAVA_TOOL_OPTIONS = -Dfile.encoding = UTF8

Wenn Sie Eclipse unter Windows verwenden, müssen Sie möglicherweise die zusätzlich verwendete Codierung festlegen (wenn Sie einen einzelnen Test über Eclipse ausführen).

Ville Myrskyneva
quelle
Ich bin mir nicht sicher, ob es einen Maven-Weg gibt, da dies eine JVM-Einstellung ist, nicht Maven.
Ville Myrskyneva
4
Ich denke, Sie vermischen die Dinge. Sie müssen nur festlegen, -Dfile.encodingob Sie E / A in Java verwenden, ohne explizit eine Codierung anzugeben (was nicht empfohlen wird). Ich verstehe nicht, was dies mit skandischen Buchstaben in Java-Quelldateien zu tun hat. Nicht-ASCII in Java-Quelldateien funktioniert mit Maven, wenn project.build.sourceEncodinges richtig eingestellt ist, wie in Ethan Leroys Antwort beschrieben.
Sleske
@sleske Ich würde davon ausgehen, dass das Gleiche ausreichen würde, aber als ich hier zum ersten Mal endete und die pom.xml-Änderungen vornahm, konnte mein Problem nicht behoben werden. Nach mehr Suche und nach Versuch und Irrtum funktionierte die beschriebene Lösung. Ich denke, der Grund dafür ist, dass der Maven den Javac des installierten / verwiesenen JDK aufruft, der wiederum die O / S-Codierung als Standard verwendet. Wenn jemand eine Möglichkeit kennt, die Codierung für den Javac-Aufruf in pom.xml anzugeben, würde dieses Problem auf "Maven-Weise" gelöst.
Ville Myrskyneva
4
@VilleMyrskyneva: Wenn Maven aufruft javac, wird die von project.build.sourceEncoding(Sie können dies überprüfen mvn -X) festgelegte Codierung weitergegeben , sodass ich nicht sehe, wie das, was Sie beschreiben, notwendig ist. Wenn in Ihrem Projekt immer noch Codierungsprobleme auftreten, sollten Sie dies als separate Frage in Betracht ziehen - anscheinend stoßen Sie auf ein anderes Problem. Stellen Sie im Idealfall einen reproduzierbaren Testfall auf.
Sleske
@sleske Ich habe project.build.sourceEncoding in pom.xml, aber mvn test hat immer noch Probleme mit der Codierung. während das -Dfile.encoding = UTF8 es löst. Ich verstehe nicht warum. stackoverflow.com/questions/42990644/…
Tiina
41

Wenn Sie die obigen Antworten kombinieren, sollte schließlich eine für UTF-8 konfigurierte pom.xml so aussehen.

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
quelle
1
Der Standardwert scheint $ {project.build.sourceEncoding} zu sein, daher sollten Sie ihn nicht explizit für das Maven-Resources-Plugin definieren müssen (siehe maven.apache.org/plugins/maven-resources-plugin/examples/…) , maven.apache.org/plugins/maven-resources-plugin/… , maven.apache.org/general.html#encoding-warning )
George Birbilis
Nein, die einzige globale Einstellung der Codierung muss von env vorgenommen werden. Variable: stackoverflow.com/a/9976788/715269
Gangnus
7

Es scheint, dass Leute eine Inhaltscodierung mit einer erstellten Datei- / Ressourcencodierung mischen. Es reicht nicht aus, nur Maven-Eigenschaften zu haben. Mit -Dfile.encoding=UTF8nicht wirksam. Um Probleme mit der Codierung zu vermeiden, sollten Sie die folgenden einfachen Regeln befolgen

  1. Stellen Sie die Maven-Codierung wie oben beschrieben ein:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  1. Stellen Sie die Codierung immer explizit ein, wenn Sie mit Dateien, Zeichenfolgen und E / A in Ihrem Code arbeiten. Wenn Sie diese Regel nicht befolgen, hängt Ihre Anwendung von der Umgebung ab. Das ist -Dfile.encoding=UTF8genau für die Konfiguration der Laufzeitumgebung verantwortlich, aber wir sollten uns nicht darauf verlassen. Wenn Sie Tausende von Clients haben, ist es aufwändiger, Systeme zu konfigurieren und Probleme zu finden. Sie haben nur eine zusätzliche Abhängigkeit davon, die Sie vermeiden können, indem Sie sie explizit festlegen. Die meisten Methoden in Java, die eine Standardcodierung verwenden, werden aufgrund dessen als veraltet markiert.

  2. Stellen Sie sicher, dass der Inhalt, mit dem Sie arbeiten, auch dieselbe Codierung aufweist, die Sie erwarten. Ist dies nicht der Fall, spielen die vorherigen Schritte keine Rolle! Zum Beispiel wird eine Datei nicht korrekt verarbeitet, wenn ihre Codierung nicht UTF8 ist, Sie es aber erwarten. So überprüfen Sie die Dateicodierung unter Linux:

$ file --mime F_PRDAUFT.dsv

  1. Erzwingen Sie die explizite Codierung von Clients / Servern in Anforderungen / Antworten. Hier einige Beispiele:
@Produces("application/json; charset=UTF-8")
@Consumes("application/json; charset=UTF-8")

Hoffe, dass dies für jemanden nützlich sein wird.

Alexandr
quelle
Nein, die einzige globale Einstellung der Codierung muss von env vorgenommen werden. Variable: stackoverflow.com/a/9976788/715269
Gangnus
6

Versuche dies:

<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
quelle
Besonders wichtig ist, dass wir nicht vergessen, dass nicht nur die Quellen, sondern auch die Ressourcen diese Codierungseinstellung benötigen.
Peterh - Wiedereinsetzung Monica