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.