8

这是一个非常罕见的问题,但我真的希望它在发生这种情况时使构建失败:


/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.6or-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

设置sourceTypeCompatibilitybetween 1.5, 1.6, and1.7似乎没有多大作用。 1.5, 当使用-sourceon时javac将错误变为warning:. 使用 Gradle,它仍然是error:一个.1.61.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 构建输出并根据该特定错误消息使构建失败?

4

3 回答 3

1
//ignoreFailures = true

如果您希望它失败,请插入并取消注释上面的行,将此语句放在以下部分下,看看它是否有效。

tasks.withType(Compile) {
     options.debug = true
     options.compilerArgs = ["-g"]
   }
于 2014-01-14T23:08:03.603 回答
1

似乎这将使其构建失败:


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

但是,不确定这是否有其他影响,但我会试一试。

于 2013-10-08T15:21:17.413 回答
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"
}
于 2013-10-08T03:54:26.207 回答