这是一个非常罕见的问题,但是我真的很想在发生这种情况时让它失败:
/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");
使用Ant或在命令行上运行javac
,使用-source 1.6
或-source 1.7
会导致此操作失败。使用Gradle,它打印为error:
(如果sourceCompatibility
设置为6或更高),但构建仍然成功。
我已经尝试了各种方法将-source
参数放入javac
任务的compileJava
命令中,但我尝试过的任何内容似乎都无法让Gradle报告这是一次失败。
还有其他人遇到过这个吗?
编辑:更多细节:
如果我在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.");
}
}
然后使用此build.gradle
,Gradle 1.3和Java 1.7传递没有错误或警告:
apply plugin: 'java'
tasks.withType(Compile) {
options.encoding = "iso-8859-1"
}
输出是:
[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
如果我删除了options.encoding
,或将其设置为UTF-8
,我就明白了:
[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
在sourceTypeCompatibility
,1.5
和1.6
之间设置1.7
似乎并不多。在1.5
上使用-source
时,javac
会将错误转换为warning:
。使用Gradle时,它仍然是error:
,但有趣的是它不会在下一个版本中重新编译,而使用1.6
和1.7
则会重新编译。
当Gradle构建时,我尝试了各种方法尝试将-source
传递给javac,但它们似乎都没有工作:
不构建:
options.compilerArgs < '-source 1.7'
构建,但不会出错(与没有标志相同):
options.compilerArgs << '-source'
options.compilerArgs << '1.7'
所有这些似乎都与Gradle实际上并没有使用javac
可执行文件进行编译这一事实有关 - 它使用某种JVM编译API,其中包含许多非常复杂的代码。如果我尝试复制Gradle 似乎要做的事情,我可以创建一个类来编译我的类,如下所示:javax/tools/CompileTest.java
您可以使用此小型项目重现问题:https://github.com/Jun-Dai/gradle_utf8_compilation_issue
有没有人知道解决这个问题的方法,除了解析Gradle构建输出和基于该特定错误消息的构建失败?
答案 0 :(得分:1)
这似乎会让它失败了构建:
options.fork = true
options.forkOptions.executable = 'javac'
不确定是否还有其他后果,但我会试一试。
答案 1 :(得分:1)
//ignoreFailures = true
如果您希望它失败,请插入和取消注释上述行,将此语句放在以下部分下,看看它是否有效。
tasks.withType(Compile) {
options.debug = true
options.compilerArgs = ["-g"]
}
答案 2 :(得分:0)
在build.gradle的 buildscript {} 部分中尝试此操作:
buildscript {
repositories {
mavenCentral()
}
tasks.withType(Compile) {
options.encoding = "UTF-8"
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'java'
<强>更新强> 你现在可以这样做:
android {
compileOptions.encoding = "UTF-8"
}