gradle - 当源代码中存在非 UTF8 字符时,如何让 Gradle 构建失败?

标签 gradle javac

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


/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 , 使用时 -sourcejavac将错误变成 warning: .使用 Gradle,它仍然是 error: ,但有趣的是它不会在下一次构建时重新编译,而使用 1.61.7确实如此。

我尝试了各种方法试图通过-source在 Gradle 构建时进入 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 构建输出并根据该特定错误消息使构建失败?

最佳答案

看起来这将允许它构建失败:


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

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

关于gradle - 当源代码中存在非 UTF8 字符时,如何让 Gradle 构建失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19224617/

相关文章:

Javac 与 1.7 的交叉编译

JavaCompiler API - 在 tomcat 中运行时编译速度慢

java - 为复制任务创建动态全局列表的 Gradle 任务顺序排除

android - 尝试构建时出现重复类错误

gradle - log4j2错误:正在运行通过Gradle生成的jar-log4j:WARN找不到记录器的附加程序

java - JVM 是生成字节码还是运行字节码?

gradle - 将Gradle缓存添加到Sonatype Nexus

Android Gradle 问题?

javac : command not found

java - 编译应用程序后找不到主类