¿Por qué Maven me advierte sobre la codificación?

99

Mi objetivo es crear un arquetipo a partir de un proyecto.

Cuando ejecuto un objetivo que no involucra el complemento maven-archetype-plugin, no veo ninguna advertencia:

[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]

En el otro extremo, cuando ejecuto archetype: create-from-project, obtengo un par:

[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

Sé que la forma "estándar" de los expertos es usar la project.build.sourceEncodingpropiedad. Intenté agregar algunas propiedades más al pom para abordar este problema, pero ninguna de ellas funcionó.

¿Algunas ideas? Gracias.

Tengo el siguiente pom.xml:

<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
fuente

Respuestas:

18

Cuando ejecuta el objetivo archetype:create-from-project, Maven genera un archivo POM para construir el arquetipo target/generated-sources/archetype/pom.xmly luego ejecuta el packageobjetivo (por defecto) en este POM.

El archivo POM generado no tiene project.build.sourceEncodingninguna otra propiedad que defina la codificación, y es por eso que recibe la advertencia.

El POM se genera a partir de este prototipo por org.apache.maven.archetype.creator.FilesetArchetypeCreator#createArchetypeProjectPom, y desde ese código no parece ser una manera de agregar propiedades al archivo POM resultante.

izstas
fuente
148

No ha establecido la propiedad predeterminada de codificación como esta:

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

Este enfoque es mejor que definir la codificación manualmente para cada complemento, ya que todos los complementos tienen valores predeterminados para la codificación, por ejemplo, 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}

Entonces, esto significa que solo necesita definir esta propiedad y el complemento usará automáticamente esta codificación.

Khmarbaise
fuente
1
Lo configuré. Mira mi pom. Gracias
Marco Ferrari
1
Puede eliminar las entradas en las configuraciones del complemento <encoding>${encoding}</encoding>.
Khmarbaise
1
Okay. Agregué esas entradas para ver si resolvían el problema, pero no tuve suerte
Marco Ferrari
No entiendo por qué el respaldo está usando codificación de plataforma en lugar de UTF-8. ¿Soporte heredado?
msa
@msa porque no todas las plataformas tienen UTF-8 por defecto. El ejemplo más simple de Windows.
Khmarbaise
35

Me molestó ver que Maven seguía quejándose después de la entrada anterior

Luego me di cuenta de que es el complemento a prueba de fallos y necesita su propia propiedad

Asi que aqui va

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