Pourquoi Maven me prévient-il de l'encodage?

94

Mon objectif est de créer un archétype à partir d'un projet.

Lorsque je lance un objectif qui n'implique pas le plugin maven-archetype-plugin, je ne vois aucun avertissement:

[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-archetype-base ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-archetype-base ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]

De l'autre côté, lorsque j'exécute archetype: create-from-project, j'obtiens un couple:

[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-archetype-base-archetype ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 10 resources
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-archetype-base-archetype ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 2 resources

Je sais que la manière maven "standard" est d'utiliser la project.build.sourceEncodingpropriété. J'ai essayé d'ajouter quelques propriétés supplémentaires au pom afin de résoudre ce problème, mais aucune d'elles n'a fonctionné.

Des idées? Merci.

J'ai le pom.xml suivant:

<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>my.group.id</groupId>
<artifactId>my-artifact</artifactId>
<version>0.0.1</version>
<packaging>maven-archetype</packaging>

<properties>

    <!-- Compiler properties -->
    <maven.compiler.target>1.7</maven.compiler.target>
    <maven.compiler.source>1.7</maven.compiler.source>
    <encoding>UTF-8</encoding>
    <project.build.sourceEncoding>${encoding}</project.build.sourceEncoding>
    <project.reporting.outputEncoding>${encoding}</project.reporting.outputEncoding>
    <project.resources.sourceEncoding>${encoding}</project.resources.sourceEncoding>
    <archetype.encoding>${encoding}</archetype.encoding>

    <!-- Maven plugins version -->
    <maven-archetype-plugin-version>2.2</maven-archetype-plugin-version>
    <maven-resources-plugin-version>2.6</maven-resources-plugin-version>

    <!-- Maven extentions version -->
    <maven-archetype-packaging-extension-version>2.2</maven-archetype-packaging-extension-version>
</properties>
<dependencies>
[...]
</dependencies>

<build>
    <extensions>
        <extension>
            <groupId>org.apache.maven.archetype</groupId>
            <artifactId>archetype-packaging</artifactId>
            <version>${maven-archetype-packaging-extension-version}</version>
        </extension>
    </extensions>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>${maven-resources-plugin-version}</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-archetype-plugin</artifactId>
            <version>${maven-archetype-plugin-version}</version>
            <extensions>true</extensions>
        </plugin>

    </plugins>

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

Marco Ferrari
la source

Réponses:

18

Lorsque vous exécutez l'objectif archetype:create-from-project, Maven génère un fichier POM pour la construction de l'archétype sur target/generated-sources/archetype/pom.xmlpuis exécute l' packageobjectif (par défaut) sur ce POM.

Le fichier POM généré n'a project.build.sourceEncodingni aucune autre propriété définissant le codage, et c'est pourquoi vous obtenez l'avertissement.

Le POM est généré à partir de ce prototype par org.apache.maven.archetype.creator.FilesetArchetypeCreator#createArchetypeProjectPom, et à partir de ce code, il ne semble pas y avoir de moyen d'ajouter des propriétés au fichier POM résultant.

izstas
la source
140

Vous n'avez pas défini la propriété par défaut d'encodage comme ceci:

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

Cette approche est meilleure que de définir l'encodage manuellement pour chaque plugin, car tous les plugins ont des valeurs par défaut pour l' encodage, par exemple le maven-resources-plugin :

encoding:

The character encoding scheme to be applied when filtering resources.
Type: java.lang.String
Required: No
User Property: encoding
Default: ${project.build.sourceEncoding}

Cela signifie donc qu'il vous suffit de définir cette propriété et le plugin utilisera automatiquement cet encodage.

khmarbaise
la source
1
Je l'ai mis. Regardez mon pom. Merci
Marco Ferrari
1
Vous pouvez supprimer les entrées dans les configurations du plugin <encoding>${encoding}</encoding>.
khmarbaise
1
D'accord. J'ai ajouté ces entrées pour voir si le problème résolu, mais pas de chance
Marco Ferrari
Je ne comprends pas pourquoi la solution de secours utilise le codage de la plate-forme au lieu de UTF-8. Support hérité?
msa le
@msa car toutes les plates-formes n'ont pas UTF-8 par défaut. Exemple le plus simple de Windows.
khmarbaise le
33

J'étais ennuyé de voir que maven continuait à se plaindre après l'entrée ci-dessus

Ensuite, j'ai réalisé que c'était le plugin de sécurité et qu'il avait besoin de sa propre propriété

Alors voilà

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
Kalpesh Soni
la source