Come configurare la codifica in Maven?


375

Quando corro maven installsul mio progetto maven multi modulo ho sempre il seguente output:

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

Quindi, ho cercato su Google un po ', ma tutto quello che posso trovare è che devo aggiungere:

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

... al mio pom.xml. Ma è già lì (nel genitore pom.xml).

Anche la configurazione <encoding>per il plugin maven-resources o il plugin-compilatore maven non lo risolve.

Allora, qual'è il problema?


1
Fai attenzione che la codifica UTF-8 è ciò che desideri effettivamente specificare come codifica. Potresti stare meglio usando una codifica più semplice come ISO-8859-1 (aka Latin-1) o persino US-ASCII.
— rmp

40
"Potrebbe essere meglio usare una codifica più semplice come ..." sì, e gli utenti finali bug, così come altri sviluppatori ... Oggi è meglio provare a usare UTF-8 il più possibile e preoccuparsi degli altri codifiche solo quando viene emesso un requisito dell'applicazione multi-codifica. Qui, stiamo parlando principalmente della codifica dei file di origine e di configurazione, la codifica dell'input dell'utente è gestita in modo diverso (con "java -Dfile.encoding ..." e con un intenso sforzo di programmazione).
— zakmck,

Personalmente ho deciso che i problemi di codifica erano così elusivi che ho optato per la codifica ASCII in pom.xml e poi ho preso in considerazione i problemi di codifica. Ciò è naturalmente richiesto dall'avere un carattere non ASCII nel mio nome che dà problemi dal primo giorno :)
— Thorbjørn Ravn Andersen

Quale codifica è impostata in pom.xml padre?
— Ripon Al Wasim,

Risposte:


535

OK, ho trovato il problema.

Uso alcuni plugin di segnalazione. Nella documentazione del plugin failafe-maven ( http://maven.apache.org/plugins/maven-failsafe-plugin/integration-test-mojo.html ) ho scoperto che la <encoding>configurazione, ovviamente, utilizza ${project.reporting.outputEncoding}di default . Quindi ho aggiunto la proprietà come elemento figlio projectdell'elemento e ora tutto va bene:

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

Guarda anche http://maven.apache.org/general.html#encoding-warning


Quindi ho avuto questo problema e ho aggiunto le proprietà dall'alto in questo modo: <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, l'unica impostazione globale della codifica deve essere eseguita da env. variabile: stackoverflow.com/a/9976788/715269
— Gangnus

Funziona come previsto aggiungendo le 2 proprietà al blocco delle proprietà del file pom.xml. Grazie.
— Jean Paul Ruiz,

47

Questo sarebbe in aggiunta al precedente, se qualcuno incontra un problema con lettere scandal che non è stato risolto con la soluzione sopra.

Se i file sorgente java contengono lettere scandali, devono essere interpretati correttamente da Java utilizzato per la compilazione . (ad esempio lettere scandiche utilizzate nelle costanti)

Anche se i file sono memorizzati in UTF-8 e Maven è configurato per utilizzare UTF-8, il sistema Java utilizzato da Maven utilizzerà comunque l'impostazione predefinita del sistema (ad es. In Windows: cp1252).

Questo sarà visibile solo eseguendo i test tramite Maven (possibilmente stampando i valori di queste costanti nei test. Le lettere scandiche stampate mostrerebbero '<?>') Se non testate correttamente, questo danneggerebbe i file di classe come risultato della compilazione ed essere lasciato inosservato.

Per evitare ciò, è necessario impostare Java utilizzato per la compilazione per utilizzare la codifica UTF-8. Non è sufficiente avere le impostazioni di codifica in maven pom.xml, è necessario impostare la variabile di ambiente: JAVA_TOOL_OPTIONS = -Dfile.encoding = UTF8

Inoltre, se si utilizza Eclipse in Windows, potrebbe essere necessario impostare la codifica utilizzata in aggiunta a questa (se si esegue un test individuale tramite eclipse).


Non sono sicuro che ci sia un modo malvagio per farlo, dato che si tratta di un'impostazione JVM, non di Maven.
— Ville Myrskyneva,

4
Penso che stai mescolando le cose. È necessario impostare solo -Dfile.encodingse si utilizza l'I / O in Java senza specificare esplicitamente una codifica (che non è consigliata). Non vedo cosa abbia a che fare con le lettere scandali nei file sorgente Java. Non ASCII nei file sorgente Java funziona con Maven quando project.build.sourceEncodingè impostato correttamente, come descritto nella risposta di Ethan Leroy.
— sleske,

@sleske Suppongo che lo stesso sarebbe abbastanza, ma quando ho finito per la prima volta qui e ho fatto le modifiche pom.xml, non ha risolto il mio problema. Dopo ulteriori ricerche e dopo tentativi ed errori, la soluzione descritta ha funzionato. Penso che il motivo di ciò che accade sia perché il Maven chiama il javac del JDK installato / riferito che a sua volta utilizza la codifica O / S come predefinita. Se qualcuno conosce un modo per specificare la codifica per la chiamata javac in pom.xml risolverebbe questo problema in "modo maven".
— Ville Myrskyneva,

4
@VilleMyrskyneva: quando invoca Maven javac, passerà lungo la codifica impostata da project.build.sourceEncoding(puoi controllare usando mvn -X), quindi non vedo come sia necessario ciò che descrivi. Se continui a riscontrare problemi di codifica nel tuo progetto, considera di farla come una domanda separata: sembra che tu stia riscontrando un problema diverso. Idealmente, pubblica un caso di test riproducibile.
— sleske,

@sleske Ho project.build.sourceEncoding in pom.xml, ma il test mvn ha ancora problemi con la codifica. mentre -Dfile.encoding = UTF8 lo risolve. Non capisco perché. stackoverflow.com/questions/42990644/…
— Tiina

41

Se si combinano le risposte sopra, finalmente un pom.xml configurato per UTF-8 dovrebbe apparire così.

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>

1
il valore predefinito sembra essere $ {project.build.sourceEncoding}, quindi non dovresti aver bisogno di definirlo esplicitamente per il plugin-risorse- maven (vedi 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, l'unica impostazione globale della codifica deve essere eseguita da env. variabile: stackoverflow.com/a/9976788/715269
— Gangnus

7

Sembra che le persone mescolino una codifica dei contenuti con una codifica di file / risorse incorporata. Avere solo proprietà maven non è abbastanza. Non -Dfile.encoding=UTF8avendo efficacia. Per evitare problemi con la codifica è necessario seguire le seguenti semplici regole

  1. Imposta la codifica Maven, come descritto sopra:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  1. Imposta sempre la codifica in modo esplicito, quando lavori con file, stringhe, IO nel tuo codice. Se non si segue questa regola, l'applicazione dipende dall'ambiente. Il-Dfile.encoding=UTF8 è esattamente responsabile di configurazione dell'ambiente di run-time, ma non dobbiamo dipendere da esso. Se hai migliaia di client, ci vuole uno sforzo maggiore per configurare i sistemi e trovare i problemi a causa di ciò. Hai solo una dipendenza aggiuntiva che puoi evitare impostandola esplicitamente. La maggior parte dei metodi in Java che utilizzano una codifica predefinita sono contrassegnati come obsoleti a causa di essa.

  2. Assicurati che anche il contenuto con cui stai lavorando sia nella stessa codifica che ti aspetti. In caso contrario, i passaggi precedenti non contano! Ad esempio un file non verrà elaborato correttamente, se la sua codifica non è UTF8 ma te lo aspetti. Per verificare la codifica dei file su Linux:

$ file --mime F_PRDAUFT.dsv

  1. Forza la codifica dei client / server in modo esplicito nelle richieste / risposte, ecco alcuni esempi:
@Produces("application/json; charset=UTF-8")
@Consumes("application/json; charset=UTF-8")

Spero che questo sia utile a qualcuno.


No, l'unica impostazione globale della codifica deve essere eseguita da env. variabile: stackoverflow.com/a/9976788/715269
— Gangnus

6

Prova questo:

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

Particolarmente importante, non dovremmo dimenticare che non solo le fonti, ma anche le risorse hanno bisogno di questa impostazione di codifica.
— Peter - Ripristina Monica il

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.