È 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?
Hai trovato una soluzione? –
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. –
Ho risolto il mio problema semplicemente usando android {compileOptions.encoding = "Cp1252" –