Comment configurer l'encodage dans Maven?

375

Lorsque maven installj'exécute mon projet maven multi-modules, j'obtiens toujours la sortie suivante:

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

Donc, j'ai fait une petite recherche sur Google, mais tout ce que je peux trouver, c'est que je dois ajouter:

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

... à mon pom.xml. Mais c'est déjà là (chez le parent pom.xml).

La configuration <encoding>du maven-resources-plugin ou du maven-compiler-plugin ne le résout pas non plus.

Donc quel est le problème?

Ethan Leroy
la source
1
Veillez à ce que l'encodage UTF-8 soit ce que vous voulez réellement spécifier comme encodage. Vous pouvez être mieux en utilisant un encodage plus simple tel que ISO-8859-1 (aka Latin-1) ou même US-ASCII.
rmp
40
"Il vaut peut-être mieux utiliser un encodage plus simple tel que ..." ouais, et les utilisateurs finaux de bogues, ainsi que d'autres développeurs ... De nos jours, il est préférable d'essayer d'utiliser UTF-8 autant que possible et de se soucier des autres encodages uniquement lorsqu'une exigence d'application multi-encodage vous est envoyée. Ici, nous parlons principalement de l'encodage des fichiers source et de configuration, l'encodage des entrées utilisateur est géré différemment (avec 'java -Dfile.encoding ...' et avec beaucoup d'efforts de programmation pénibles).
zakmck
J'ai personnellement décidé que les problèmes d'encodage étaient si difficiles à saisir que j'ai opté pour l'encodage ASCII dans pom.xml, puis j'ai pris les problèmes d'encodage à l'avant. Ceci est naturellement provoqué par un caractère non ASCII en mon nom donnant des problèmes depuis le jour 1 :)
Thorbjørn Ravn Andersen
Quel encodage est défini dans le parent pom.xml?
Ripon Al Wasim

Réponses:

535

OK, j'ai trouvé le problème.

J'utilise des plugins de reporting. Dans la documentation du module de sécurité-maven-plugin ( http://maven.apache.org/plugins/maven-failsafe-plugin/integration-test-mojo.html ), j'ai trouvé que la <encoding>configuration - bien sûr - utilise ${project.reporting.outputEncoding}par défaut . J'ai donc ajouté la propriété en tant qu'élément enfant de l' projectélément et tout va bien maintenant:

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

Voir également http://maven.apache.org/general.html#encoding-warning

Ethan Leroy
la source
J'ai donc eu ce problème et j'ai ajouté les propriétés ci-dessus comme ceci: <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
Non, le seul réglage global du codage doit être fait par env. variable: stackoverflow.com/a/9976788/715269
Gangnus
Cela fonctionne comme prévu lors de l'ajout des 2 propriétés au bloc de propriétés du fichier pom.xml. Merci.
Jean Paul Ruiz
47

Ce serait en plus du précédent, si quelqu'un rencontre un problème avec les lettres de scandale qui n'est pas résolu avec la solution ci-dessus.

Si les fichiers source java contiennent des lettres de scandale, ils doivent être interprétés correctement par le Java utilisé pour la compilation . (par exemple, lettres de scandale utilisées dans les constantes)

Même si les fichiers sont stockés dans UTF-8 et que le Maven est configuré pour utiliser UTF-8, le système Java utilisé par le Maven utilisera toujours la valeur par défaut du système (par exemple, sous Windows: cp1252).

Cela ne sera visible qu'en exécutant les tests via maven (éventuellement en imprimant les valeurs de ces constantes dans les tests. Les lettres de scandale imprimées s'afficheraient comme '<?>'). laissé inaperçu.

Pour éviter cela, vous devez définir le Java utilisé pour la compilation pour utiliser le codage UTF-8. Il ne suffit pas d'avoir les paramètres d'encodage dans le maven pom.xml, vous devez définir la variable d'environnement: JAVA_TOOL_OPTIONS = -Dfile.encoding = UTF8

De plus, si vous utilisez Eclipse dans Windows, vous devrez peut-être définir le codage utilisé en plus de cela (si vous exécutez un test individuel via eclipse).

Ville Myrskyneva
la source
Je ne sais pas s'il existe un moyen maven de le faire, car il s'agit d'un paramètre JVM, pas Maven.
Ville Myrskyneva le
4
Je pense que vous mélangez les choses. Vous devez uniquement définir -Dfile.encodingsi vous utilisez les E / S en Java sans spécifier explicitement un encodage (ce qui n'est pas recommandé). Je ne vois pas ce que cela a à voir avec les lettres de scandale dans les fichiers source Java. Les fichiers source non ASCII dans Java fonctionnent avec Maven lorsqu'il project.build.sourceEncodingest correctement défini, comme décrit dans la réponse d'Ethan Leroy.
sleske
@sleske Je suppose que la même chose serait suffisante, mais lorsque je me suis arrêté pour la première fois ici et que j'ai apporté les modifications pom.xml, cela n'a pas résolu mon problème. Après plus de recherches et après essais et erreurs, la solution décrite a fonctionné. Je pense que la raison de ce qui se passe est que le maven appelle le javac du JDK installé / référé qui à son tour utilise l'encodage O / S par défaut. Si quelqu'un connaît un moyen de spécifier l'encodage pour l'appel javac dans pom.xml, cela résoudrait ce problème de la manière "maven".
Ville Myrskyneva du
4
@VilleMyrskyneva: Lorsque Maven invoque javac, il transmet l'encodage défini par project.build.sourceEncoding(vous pouvez vérifier en utilisant mvn -X), donc je ne vois pas en quoi ce que vous décrivez est nécessaire. Si vous rencontrez toujours des problèmes d'encodage dans votre projet, envisagez de poser cette question séparément - il semble que vous rencontriez un problème différent. Idéalement, postez un cas de test reproductible.
sleske
@sleske J'ai project.build.sourceEncoding dans pom.xml, mais le test mvn a toujours un problème avec l'encodage. tandis que -Dfile.encoding = UTF8 le résout. Je ne comprends pas pourquoi. stackoverflow.com/questions/42990644/…
Tiina
41

Si vous combinez les réponses ci-dessus, enfin un pom.xml configuré pour UTF-8 devrait ressembler à cela.

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
la source
1
la valeur par défaut semble être $ {project.build.sourceEncoding}, vous ne devriez donc pas avoir besoin de la définir explicitement pour le plug-in maven -resources (voir maven.apache.org/plugins/maven-resources-plugin/examples/… , maven.apache.org/plugins/maven-resources-plugin/… , maven.apache.org/general.html#encoding-warning )
George Birbilis
Non, le seul réglage global du codage doit être fait par env. variable: stackoverflow.com/a/9976788/715269
Gangnus
7

Il semble que les gens mélangent un encodage de contenu avec un encodage de fichiers / ressources intégré. Avoir uniquement des propriétés maven ne suffit pas. N'ayant -Dfile.encoding=UTF8pas été efficace. Pour éviter d'avoir des problèmes avec l'encodage, vous devez suivre les règles simples suivantes

  1. Définissez l'encodage maven, comme décrit ci-dessus:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  1. Définissez toujours l'encodage de manière explicite, lorsque vous travaillez avec des fichiers, des chaînes, des E / S dans votre code. Si vous ne respectez pas cette règle, votre application dépend de l'environnement. Le -Dfile.encoding=UTF8est exactement responsable de la configuration de l'environnement d'exécution, mais nous ne devons pas en dépendre. Si vous avez des milliers de clients, il faut plus d'efforts pour configurer les systèmes et trouver les problèmes à cause de cela. Vous avez juste une dépendance supplémentaire à ce sujet que vous pouvez éviter en la définissant explicitement. La plupart des méthodes en Java qui utilisent un encodage par défaut sont marquées comme obsolètes à cause de cela.

  2. Assurez-vous que le contenu avec lequel vous travaillez est également dans le même encodage que vous attendez. Si ce n'est pas le cas, les étapes précédentes n'ont pas d'importance! Par exemple, un fichier ne sera pas traité correctement, si son encodage n'est pas UTF8 mais que vous vous y attendez. Pour vérifier l'encodage des fichiers sous Linux:

$ file --mime F_PRDAUFT.dsv

  1. Forcer explicitement l'encodage des ensembles clients / serveurs dans les requêtes / réponses, voici des exemples:
@Produces("application/json; charset=UTF-8")
@Consumes("application/json; charset=UTF-8")

J'espère que cela sera utile à quelqu'un.

Alexandr
la source
Non, le seul réglage global du codage doit être fait par env. variable: stackoverflow.com/a/9976788/715269
Gangnus
6

Essaye ça:

<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
la source
Particulièrement important, nous ne devons pas oublier que non seulement les sources, mais aussi les ressources ont besoin de ce paramètre d'encodage.
peterh