2013-10-07 5 views
7

È un problema abbastanza rara, ma mi piacerebbe davvero per il fallimento della generazione quando questo accade:Come si può ottenere che Gradle fallisca la compilazione quando c'è un carattere non UTF8 nel codice sorgente?


/Users/jundai/perforce/trunk/service/test/com/mycompany/PriceFormattingTests.java:93: error: unmappable character for encoding UTF-8 
     return new CurrencyModel("373959", new Price("10.20", "EUR"), "�10.20", new Price("12.10", "USD"), "$12.10"); 

con la formica o in esecuzione javac sulla riga di comando, utilizzando -source 1.6 o -source 1.7 causerà questo fallire. Usando Gradle, viene stampato come error: (se sourceCompatibility è impostato su 6 o successivo), ma la compilazione ha ancora esito positivo.

Ho provato diversi modi di ottenere l'argomento -source nel comando javac per l'attività compileJava, ma nulla ho provato sembra essere in grado di ottenere Gradle per segnalare questa come un fallimento.

Qualcun altro ha incontrato questo?

EDIT: qualche dettaglio in più:

Se ho un file codificato in winansi: src/main/java/Test.java:


public class Test { 
    public static void main(String[] args) { 
    System.out.println("Testing UTF-8 compilation: C’est drôle, tout à coup je ne sais pas quoi dire."); 
    } 
} 

allora questo passa senza errori o avvisi di utilizzare questo build.gradle, Gradle 1.3, e Java 1.7 :


apply plugin: 'java' 

tasks.withType(Compile) { 
    options.encoding = "iso-8859-1" 
} 

uscita è:


[1.9.3-p327] gradle$ gradle build 
:compileJava 
:processResources UP-TO-DATE 
:classes 
:jar 
:assemble 
:compileTestJava UP-TO-DATE 
:processTestResources UP-TO-DATE 
:testClasses UP-TO-DATE 
:test 
:check 
:build 

BUILD SUCCESSFUL 

Se rimuovo il options.encoding, o impostarlo UTF-8, ottengo questo:


[1.9.3-p327] gradle$ gradle build 
:compileJava 
/Users/jbateskobashigawa/play/gradle/src/main/java/Test.java:3: error: unmappable character for encoding UTF8 
    System.out.println("Testing UTF-8 compilation: C�est dr�le, tout � coup je ne sais pas quoi dire."); 
                ^
/Users/jbateskobashigawa/play/gradle/src/main/java/Test.java:3: error: unmappable character for encoding UTF8 
    System.out.println("Testing UTF-8 compilation: C�est dr�le, tout � coup je ne sais pas quoi dire."); 
                 ^
/Users/jbateskobashigawa/play/gradle/src/main/java/Test.java:3: error: unmappable character for encoding UTF8 
    System.out.println("Testing UTF-8 compilation: C�est dr�le, tout � coup je ne sais pas quoi dire."); 
                    ^
:processResources UP-TO-DATE 
... (more stuff) 
BUILD SUCCESSFUL 

Impostazione del sourceTypeCompatibility tra 1.5, 1.6, e 1.7 non sembra fare molto. 1.5, quando si utilizza -source su javac trasforma l'errore in warning:. Con Gradle, è ancora un error:, ma interessante non viene ricompilato nella build successiva, mentre con 1.6 e 1.7 lo fa.

Ho provato tutti i tipi di modi per cercare di passare -source in javac quando Gradle sta costruendo, ma nessuno di loro sembra funzionare:

non costruisce:


    options.compilerArgs < '-source 1.7' 

Builds, ma non errore fuori (lo stesso senza il flag):


    options.compilerArgs << '-source' 
    options.compilerArgs << '1.7' 

Tutto questo sembra avere qualcosa a che fare con il fatto che Gradle non è in realtà utilizzando la javac eseguibile da compilare: utilizza una sorta di API di compilazione JVM che contiene molto codice molto contorto.Se provo a replicare quello Gradle sembra di fare, posso creare una classe per compilare la mia classe che assomiglia a questo: javax/tools/CompileTest.java

È possibile riprodurre il problema utilizzando questo mini progetto: https://github.com/Jun-Dai/gradle_utf8_compilation_issue

C'è qualcuno conoscere un modo per aggirare questo problema, a meno di analizzare l'output di build di Gradle e fallire la compilazione in base a quel particolare messaggio di errore?

+1

Hai trovato una soluzione? –

+0

Purtroppo no. Periodicamente guardo l'output della build e se vedo l'avviso sopra, lo aggiusto manualmente. Immagino che questo problema sia abbastanza raro da essere effettivamente una soluzione praticabile anche su un grande numero di codice con molti sviluppatori. –

+1

Ho risolto il mio problema semplicemente usando android {compileOptions.encoding = "Cp1252" –

risposta

0

Prova questo nella vostra buildscript {} sezione del build.gradle:

buildscript { 
    repositories { 
    mavenCentral() 
    } 

    tasks.withType(Compile) { 
    options.encoding = "UTF-8" 
    } 

    dependencies { 
    classpath 'com.android.tools.build:gradle:0.5.+' 
    } 
} 

apply plugin: 'java' 

AGGIORNAMENTO È ora possibile fare questo:

android { 
    compileOptions.encoding = "UTF-8" 
} 
+0

Sì, non ha funzionato. –

+0

Devi mettere quel blocco nel blocco buildscript {} nella parte superiore di build.gradle. Sei stato tu?? –

+0

Non ho un blocco 'buildscript {}' all'inizio del mio build.gradle, ma quando ho provato ad aggiungerne uno solo ora, il risultato è lo stesso. Ecco il build.gradle per il mio esempio: 'applicare plugin: 'java'' ' buildscript { tasks.withType (Compile) { options.encoding = "UTF-8" }} ' –

1

Sembra che questo permetterà lo fallire la costruzione:


    options.fork = true 
    options.forkOptions.executable = 'javac' 

Non so se questo ha altre ramificazioni, tuttavia, ma ci provo.

1
//ignoreFailures = true 

Inserire e rimuovere il commento dalla riga precedente se si desidera che non riesca, inserire questa istruzione nella sezione seguente, vedere se funziona.

tasks.withType(Compile) { 
    options.debug = true 
    options.compilerArgs = ["-g"] 
    }