这是一个非常罕见的问题,但我真的希望它在发生这种情况时使构建失败:
/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
or-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.");
}
}
然后使用 this 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
between 1.5
, 1.6
, and1.7
似乎没有多大作用。 1.5
, 当使用-source
on时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 构建输出并根据该特定错误消息使构建失败?