¿Cómo configurar la codificación en Maven?

375

Cuando ejecuto maven installmi proyecto maven de módulos múltiples, siempre obtengo el siguiente resultado:

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

Así que busqué en Google un poco, pero todo lo que puedo encontrar es que tengo que agregar:

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

... a mi pom.xml. Pero ya está allí (en el padre pom.xml).

La configuración <encoding>para el complemento de recursos maven o el complemento de compilación maven tampoco lo soluciona.

¿Entonces, cuál es el problema?

Ethan Leroy
fuente
1
Tenga cuidado de que la codificación UTF-8 es lo que realmente desea especificar como codificación. Puede que sea mejor usar una codificación más simple como ISO-8859-1 (también conocido como Latin-1) o incluso US-ASCII.
rmp
40
"Puede que sea mejor usar una codificación más simple como ..." sí, y usuarios finales con errores, así como otros desarrolladores ... Hoy en día es mejor tratar de usar UTF-8 tanto como sea posible y preocuparse por otros codificaciones solo cuando se le solicita un requisito de aplicación de codificación múltiple. Aquí, hablamos principalmente de la codificación de los archivos de origen y configuración, la codificación de la entrada del usuario se gestiona de manera diferente (con 'java -Dfile.encoding ...' y con mucho esfuerzo de programación doloroso).
zakmck
Personalmente decidí que los problemas de codificación eran tan evasivos que opté por codificar ASCII en pom.xml y luego tomé los problemas de codificación por adelantado. Esto se debe naturalmente al tener un personaje que no es ASCII en mi nombre dando problemas desde el día 1 :)
Thorbjørn Ravn Andersen
¿Qué codificación se establece en padre pom.xml?
Ripon Al Wasim

Respuestas:

535

OK, encontré el problema.

Yo uso algunos complementos de informes. En la documentación de failsafe-maven-plugin ( http://maven.apache.org/plugins/maven-failsafe-plugin/integration-test-mojo.html ) descubrí que la <encoding>configuración, por supuesto, se usa ${project.reporting.outputEncoding}por defecto . Así que agregué la propiedad como elemento secundario del projectelemento y todo está bien ahora:

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

Ver también http://maven.apache.org/general.html#encoding-warning

Ethan Leroy
fuente
Así que tuve este problema y agregué las propiedades de arriba como esta: <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
No, el único entorno global de codificación lo debe hacer env. variable: stackoverflow.com/a/9976788/715269
Gangnus
Esto funciona como se esperaba al agregar las 2 propiedades al bloque de propiedades del archivo pom.xml. Gracias.
Jean Paul Ruiz
47

Esto sería adicional al anterior, si alguien encuentra un problema con las letras escandicas que no se resuelve con la solución anterior.

Si los archivos fuente de Java contienen letras escandicas, deben ser interpretados correctamente por el Java utilizado para la compilación . (ej. letras escandicas usadas en constantes)

Incluso si los archivos se almacenan en UTF-8 y el Maven está configurado para usar UTF-8, el Sistema Java utilizado por el Maven seguirá usando el sistema predeterminado (por ejemplo, en Windows: cp1252).

Esto será visible solo ejecutando las pruebas a través de Maven (posiblemente imprimiendo los valores de estas constantes en las pruebas. Las letras escandicas impresas se mostrarían como '<?>') Si no se prueba correctamente, esto dañaría los archivos de clase como resultado de la compilación y se Dejó desapercibido.

Para evitar esto, debe configurar el Java utilizado para la compilación para usar la codificación UTF-8. No es suficiente tener la configuración de codificación en el pom.xml de maven, debe establecer la variable de entorno: JAVA_TOOL_OPTIONS = -Dfile.encoding = UTF8

Además, si usa Eclipse en Windows, es posible que deba configurar la codificación utilizada además de esto (si ejecuta una prueba individual a través de eclipse).

Ville Myrskyneva
fuente
No estoy seguro de si hay una forma inteligente de hacer esto, ya que esta es una configuración JVM, no Maven.
Ville Myrskyneva
44
Creo que estás mezclando cosas. Solo necesita establecer -Dfile.encodingsi usa E / S en Java sin especificar explícitamente una codificación (que no se recomienda). No veo qué tiene que ver esto con las letras escandicas en los archivos fuente de Java. Los archivos fuente no ASCII en Java funcionan con Maven cuando project.build.sourceEncodingse configura correctamente, como se describe en la respuesta de Ethan Leroy.
sleske
@sleske Supongo que lo mismo sería suficiente, pero cuando terminé aquí e hice los cambios de pom.xml, no solucionó mi problema. Después de más búsquedas y después de prueba y error, la solución descrita funcionó. Creo que la razón de lo que sucede es porque el maven llama al javac del JDK instalado / referido que a su vez usa la codificación O / S por defecto. Si alguien conoce una forma de especificar la codificación para la llamada javac en pom.xml, se resolverá este problema de manera "maven".
Ville Myrskyneva el
44
@VilleMyrskyneva: cuando Maven invoca javac, pasará a lo largo de la codificación establecida por project.build.sourceEncoding(puede verificar usando mvn -X), por lo que no veo cómo es necesario lo que describe. Si aún tiene problemas de codificación en su proyecto, considere hacer eso como una pregunta separada: parece que se encuentra con un problema diferente. Idealmente, publique un caso de prueba reproducible.
sleske
@sleske Tengo project.build.sourceEncoding en pom.xml, pero mvn test todavía tiene problemas con la codificación. mientras que -Dfile.encoding = UTF8 lo resuelve. No entiendo por qué. stackoverflow.com/questions/42990644/…
Tiina
41

Si combina las respuestas anteriores, finalmente un pom.xml configurado para UTF-8 debería verse así.

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
fuente
1
el valor predeterminado parece ser $ {project.build.sourceEncoding}, por lo que no debería necesitar definirlo explícitamente para el complemento maven-resources (consulte maven.apache.org/plugins/maven-resources-plugin/examples/… , maven.apache.org/plugins/maven-resources-plugin/… , maven.apache.org/general.html#encoding-warning )
George Birbilis
No, el único entorno global de codificación lo debe hacer env. variable: stackoverflow.com/a/9976788/715269
Gangnus
7

Parece que las personas mezclan una codificación de contenido con una codificación de archivos / recursos incorporados. Tener solo propiedades maven no es suficiente. Tener -Dfile.encoding=UTF8no efectivo. Para evitar tener problemas con la codificación, debe seguir las siguientes reglas simples

  1. Establezca la codificación maven, como se describe arriba:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  1. Siempre configure la codificación explícitamente, cuando trabaje con archivos, cadenas, IO en su código. Si no sigue esta regla, su aplicación dependerá del entorno. La -Dfile.encoding=UTF8exactitud es responsable de la configuración del entorno de tiempo de ejecución, pero no debemos depender de ello. Si tiene miles de clientes, se necesita más esfuerzo para configurar los sistemas y encontrar problemas debido a ello. Solo tiene una dependencia adicional que puede evitar estableciéndolo explícitamente. La mayoría de los métodos en Java que usan una codificación predeterminada están marcados como obsoletos debido a ello.

  2. Asegúrese de que el contenido con el que está trabajando también tenga la misma codificación que espera. Si no es así, ¡los pasos anteriores no importan! Por ejemplo, un archivo no se procesará correctamente, si su codificación no es UTF8 pero lo espera. Para verificar la codificación de archivos en Linux:

$ file --mime F_PRDAUFT.dsv

  1. Forzar la codificación de conjuntos de clientes / servidores explícitamente en solicitudes / respuestas, aquí hay ejemplos:
@Produces("application/json; charset=UTF-8")
@Consumes("application/json; charset=UTF-8")

Espero que esto sea útil para alguien.

Alexandr
fuente
No, el único entorno global de codificación lo debe hacer env. variable: stackoverflow.com/a/9976788/715269
Gangnus
6

Prueba esto:

<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
fuente
Particularmente importante, no debemos olvidar que no solo las fuentes, sino también los recursos necesitan esta configuración de codificación.
peterh - Restablecer Monica