web-dev-qa-db-fra.com

Comment configurer le codage dans Maven?

Lorsque j'exécute maven install sur mon projet multi-modules maven, j'obtiens toujours le résultat suivant:

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

Donc, j'ai un peu cherché 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à (dans le pom.xml parent).

Configurer <encoding> pour le plugin maven-resources ou le plugin maven-compiler ne résout pas non plus le problème. 

Donc quel est le problème?

305
Ethan Leroy

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

J'utilise des plugins de reporting. Dans la documentation de failafe-maven-plugin ( http://maven.Apache.org/plugins/maven-failsafe-plugin/integration-test-mojo.html ) j'ai découvert que la configuration <encoding> - de course - utilise ${project.reporting.outputEncoding} par défaut. J'ai donc ajouté la propriété en tant qu'élément enfant de l'élément project 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

464
Ethan Leroy

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

Si les fichiers source Java contiennent des lettres scandales, ils doivent être interprétés correctement par le fichier Java utilisé pour la compilation . (par exemple, lettres scandiques 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, dans Windows: cp1252).

Cela ne sera visible que si vous exécutez les tests via maven (en imprimant éventuellement les valeurs de ces constantes dans les tests. Les lettres scandales imprimées s’afficheront sous la forme '<?>'). résultat et être 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 que les paramètres de codage soient définis 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 sous Windows, vous devrez peut-être définir le codage utilisé en plus de cela (si vous exécutez un test individuel via Eclipse).

38
Ville Myrskyneva

Si vous combinez les réponses ci-dessus, 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>
28
bhdrk

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>
4
fabrik

Dans mon cas, j'utilisais le maven-dependency-plugin alors, afin de résoudre le problème, j'ai dû ajouter la propriété suivante:

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

Voir Plugin Apache Maven Resources/Spécification d'un schéma de codage de caractères

1
isapir

Il semble que les gens combinent un encodage de contenu avec un encodage de fichiers/ressources construit. Avoir que des propriétés maven ne suffit pas. Avoir -Dfile.encoding=UTF8 n'est pas efficace. Pour éviter les problèmes d’encodage, vous devez suivre les règles simples suivantes

  1. Définissez le codage 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 explicitement le codage lorsque vous utilisez des fichiers, des chaînes, IO dans votre code. Si vous ne suivez pas cette règle, votre application dépend de l'environnement. Le -Dfile.encoding=UTF8 est exactement responsable de la configuration de l'environnement d'exécution, mais nous ne devrions pas en dépendre. Si vous avez des milliers de clients, la configuration des systèmes et la recherche des problèmes s’imposent. Vous avez juste une dépendance supplémentaire sur ce que vous pouvez éviter en le définissant explicitement. La plupart des méthodes Java qui utilisent un codage par défaut sont marquées comme obsolètes à cause de cela.

  2. Assurez-vous que le contenu que vous utilisez est également dans le même encodage que vous le souhaitez. Si ce n'est pas le cas, les étapes précédentes importent peu! Par exemple, un fichier ne sera pas traité correctement si son encodage n’est pas UTF8 mais vous l’attendez. Pour vérifier le codage de fichier sous Linux:

$ file --mime F_PRDAUFT.dsv

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

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

0
Alexandr