java - profesionales - ¿Por qué Maven me advierte sobre la codificación?
interfaz grafica para netbeans (4)
Mi objetivo es crear un arquetipo de un proyecto.
Cuando ejecuto un objetivo que no implica el 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 maven "estándar" es usar la propiedad project.build.sourceEncoding
. Traté de agregar algunas propiedades más a la 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>
Cuando ejecuta el archetype:create-from-project
del objetivo archetype:create-from-project
, Maven genera un archivo POM para construir el arquetipo en target/generated-sources/archetype/pom.xml
y luego ejecuta el objetivo del package
(por defecto) en este POM.
El archivo POM generado no tiene project.build.sourceEncoding
ni ninguna otra propiedad que defina la codificación, y es por eso que obtienes 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 haber una manera de agregar propiedades al archivo POM resultante.
Me molestó ver que Maven siguió quejándose después de la entrada anterior
Entonces me di cuenta de que es el plugin de failsafe y necesita su propia propiedad
Así que aquí va
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties
No ha establecido la propiedad predeterminada de codificación de esta manera:
<project>
...
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
...
</project>
Este enfoque es mejor que definir la codificación de forma manual para cada complemento, porque 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}
Esto significa que solo necesita definir esta propiedad y el complemento usará automáticamente esta codificación.
Para eliminar esta advertencia, si realmente no desea que la compilación dependa de la plataforma, debe especificar la codificación de origen para compilaciones independientes de la plataforma en su proyecto Maven, realizando los siguientes pasos:
- Abra el archivo pom.
Agregue el siguiente código:
<project> ... <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> ... </project>
Ejecute el siguiente comando:
paquete mvn
- Observe que la advertencia ya no está presente.
Cómo funciona
La propiedad project.build.sourceEncoding especifica la codificación de los archivos fuente. Los complementos de Maven obtienen información sobre la codificación a partir del valor de esta propiedad y la utilizan. Este valor será el mismo en cualquier plataforma en la que se base el proyecto y, por lo tanto, la construcción se volverá independiente de la plataforma.