Como configurar a codificação no Maven?

375

Quando executo maven installmeu projeto multi-módulo maven, sempre obtenho a seguinte saída:

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

Então, pesquisei um pouco, mas tudo o que posso encontrar é que tenho que adicionar:

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

... ao meu pom.xml. Mas já está lá (nos pais pom.xml).

A configuração <encoding>do maven-resources-plugin ou do maven-compiler-plugin também não o corrige.

Então qual é o problema?

Ethan Leroy
fonte
11
Tenha cuidado para que a codificação UTF-8 seja o que você realmente deseja especificar como codificação. Pode ser melhor usar uma codificação mais simples, como ISO-8859-1 (também conhecida como Latin-1) ou até US-ASCII.
Rmp 14/01
40
"Você pode estar melhor usando uma codificação mais simples como ..." sim, e insere usuários finais, assim como outros desenvolvedores ... Hoje em dia é melhor tentar usar o UTF-8 o máximo possível e se preocupar com outros codificações somente quando um requisito de aplicativo de codificação múltipla é emitido para você. Aqui, estamos falando principalmente sobre a codificação dos arquivos de origem e de configuração, a codificação da entrada do usuário é gerenciada de maneira diferente (com 'java -Dfile.encoding ...' e com muito esforço de programação).
Zakmck 23/08
Pessoalmente, decidi que os problemas de codificação eram tão esquivos que fui codificar ASCII em pom.xml e, em seguida, resolvi os problemas de codificação com antecedência. Este é, naturalmente, solicitado por ter um carácter não ASCII em meu nome dando problemas do dia 1 :)
Thorbjørn Ravn Andersen
Qual codificação é definida no pom.xml pai?
Ripon Al Wasim 15/05

Respostas:

535

OK, encontrei o problema.

Eu uso alguns plugins de relatórios. Na documentação do failafe-maven-plugin ( http://maven.apache.org/plugins/maven-failsafe-plugin/integration-test-mojo.html ), achei que a <encoding>configuração - é claro - usa ${project.reporting.outputEncoding}por padrão . Então eu adicionei a propriedade como um elemento filho do projectelemento e está tudo bem agora:

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

Veja também http://maven.apache.org/general.html#encoding-warning

Ethan Leroy
fonte
Portanto, eu tive esse problema e adicionei as propriedades acima desta forma: <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
Não, a única configuração global de codificação deve ser feita por env. variável: stackoverflow.com/a/9976788/715269
Gangnus 9/03
Isso funciona conforme o esperado ao adicionar as 2 propriedades ao bloco de propriedades do arquivo pom.xml. Obrigado.
Jean Paul Ruiz
47

Isso seria um acréscimo ao anterior, se alguém encontrar um problema com letras escandinavas que não foi resolvido com a solução acima.

Se os arquivos de origem java contiverem letras escandinavas, eles precisam ser interpretados corretamente pelo Java usado para compilar . (por exemplo, letras escandinavas usadas em constantes)

Mesmo que os arquivos estejam armazenados em UTF-8 e o Maven esteja configurado para usar UTF-8, o Java do sistema usado pelo Maven ainda usará o padrão do sistema (por exemplo, no Windows: cp1252).

Isso estará visível apenas na execução dos testes via maven (possivelmente imprimindo os valores dessas constantes nos testes. As letras escandinavas impressas seriam mostradas como '<?>'). deixado despercebido.

Para evitar isso, você deve definir o Java usado para compilar para usar a codificação UTF-8. Não basta ter as configurações de codificação no maven pom.xml, é necessário definir a variável de ambiente: JAVA_TOOL_OPTIONS = -Dfile.encoding = UTF8

Além disso, se você estiver usando o Eclipse no Windows, poderá ser necessário definir a codificação usada além disso (se você executar um teste individual via eclipse).

Ville Myrskyneva
fonte
Não tenho certeza se existe uma maneira inteligente de fazer isso, já que esta é uma configuração da JVM, não o Maven.
Ville Myrskyneva
4
Eu acho que você está misturando as coisas. Você só precisa definir -Dfile.encodingse usar E / S em Java sem especificar explicitamente uma codificação (o que não é recomendado). Não vejo o que isso tem a ver com letras escândegas nos arquivos de origem Java. Os arquivos de origem não ASCII em Java funcionam com o Maven quando project.build.sourceEncodingsão definidos corretamente, conforme descrito na resposta de Ethan Leroy.
21815 sleske #
@sleske, eu diria que o mesmo seria suficiente, mas quando eu terminei aqui e fiz as alterações do pom.xml, isso não resolveu o meu problema. Após mais pesquisas e tentativas e erros, a solução descrita funcionou. Penso que a razão do que acontece é porque o maven chama o javac do JDK instalado / referido, que por sua vez usa a codificação O / S como padrão. Se alguém souber uma maneira de especificar a codificação para a chamada javac no pom.xml, isso resolverá o problema de maneira "convencional".
Ville Myrskyneva
4
@VilleMyrskyneva: Quando o Maven chama javac, ele passa a codificação definida por project.build.sourceEncoding(você pode verificar usando mvn -X), então não vejo como o que você descreve é ​​necessário. Se você ainda tiver problemas de codificação em seu projeto, considere fazer isso como uma pergunta separada - parece que você está enfrentando um problema diferente. Idealmente, publique um caso de teste reproduzível.
sleske
@sleske Eu tenho project.build.sourceEncoding no pom.xml, mas o teste mvn ainda tem problemas com a codificação. enquanto que -Dfile.encoding = UTF8 o resolve. Eu não entendo o porquê. stackoverflow.com/questions/42990644/…
Tiina
41

Se você combinar as respostas acima, finalmente um pom.xml configurado para UTF-8 deve parecer com isso.

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
fonte
11
o padrão parece ser $ {project.build.sourceEncoding}, portanto, você não precisa defini-lo explicitamente para o maven-resources-plugin (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
Não, a única configuração global de codificação deve ser feita por env. variável: stackoverflow.com/a/9976788/715269
Gangnus 9/03
7

Parece que as pessoas misturam uma codificação de conteúdo com uma codificação de arquivos / recursos incorporada. Ter apenas propriedades maven não é suficiente. Tendo -Dfile.encoding=UTF8não é eficaz. Para evitar problemas com a codificação, siga as seguintes regras simples

  1. Defina a codificação automática, conforme descrito acima:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  1. Sempre defina a codificação explicitamente, quando trabalhar com arquivos, strings, IO no seu código. Se você não seguir esta regra, seu aplicativo dependerá do ambiente. O -Dfile.encoding=UTF8exatamente é responsável pela configuração do ambiente de tempo de execução, mas não devemos depender disso. Se você possui milhares de clientes, é preciso mais esforço para configurar sistemas e encontrar problemas por causa disso. Você apenas tem uma dependência adicional que pode ser evitada configurando-a explicitamente. A maioria dos métodos em Java que usam uma codificação padrão são marcados como obsoletos por causa disso.

  2. Verifique se o conteúdo com o qual você está trabalhando também está na mesma codificação que você espera. Caso contrário, as etapas anteriores não importam! Por exemplo, um arquivo não será processado corretamente, se sua codificação não for UTF8, mas você o espera. Para verificar a codificação de arquivo no Linux:

$ file --mime F_PRDAUFT.dsv

  1. Forçar a codificação explícita de clientes / servidores em solicitações / respostas, eis alguns exemplos:
@Produces("application/json; charset=UTF-8")
@Consumes("application/json; charset=UTF-8")

Espero que isso seja útil para alguém.

Alexandr
fonte
Não, a única configuração global de codificação deve ser feita por env. variável: stackoverflow.com/a/9976788/715269
Gangnus 9/03
6

Tente o seguinte:

<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
fonte
Particularmente importante, não devemos esquecer que não apenas as fontes, mas também os recursos precisam dessa configuração de codificação.
peterh - Restabelece Monica