2013-10-07 32 views
7

这是一个罕见的不够的问题,但我真的很喜欢它,当这种情况发生构建失败:当源代码中存在非UTF8字符时,如何让Gradle无法构建?


/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或使用-source 1.6-source 1.7将导致此运行javac在命令行,失败。使用Gradle,它将打印为error:(如果sourceCompatibility设置为6或更高),但构建仍然成功。

我试过各种方法将-source参数转化为命令的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,摇篮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 

设置1.7sourceTypeCompatibility1.5之间,1.6,并且似乎并没有做太多。 1.5,如果在javac上使用-source将错误转换为warning:。使用Gradle,它仍然是error:,但有趣的是,它不会在下一个版本中重新编译,而它会使用1.61.7

我已经试过各种方法,试图通过-source到javac中,当摇篮正在建设,但他们都不似乎工作:

不建:


    options.compilerArgs < '-source 1.7' 

构建,但不报错了(与没有该标志):


    options.compilerArgs << '-source' 
    options.compilerArgs << '1.7' 

所有这一切都似乎有事可做与摇篮未实际使用事实10可执行文件进行编译 - 它使用某种JVM编译API,其中包含许多非常复杂的代码。如果我尝试复制什么摇篮似乎在做,我可以创建一个类来编译我的课,看起来像这样:javax/tools/CompileTest.java

你可以使用这个小项目重现该问题:https://github.com/Jun-Dai/gradle_utf8_compilation_issue

有谁知道解决这个问题的方法,缺少解析Gradle构建输出和基于特定错误消息构建失败?

+1

您是否找到了解决方案? –

+0

可悲的是没有。定期查看构建输出,如果我看到上述警告,我会手动修复它。我认为这个问题非常罕见,即使在拥有大量开发人员的大型代码库中,这也是一个可行的解决方案。 –

+1

我简单地使用android解决了我的问题{compileOptions.encoding =“Cp1252” –

回答

0

buildscript试试这个{}的build.gradle的部分:

buildscript { 
    repositories { 
    mavenCentral() 
    } 

    tasks.withType(Compile) { 
    options.encoding = "UTF-8" 
    } 

    dependencies { 
    classpath 'com.android.tools.build:gradle:0.5.+' 
    } 
} 

apply plugin: 'java' 

UPDATE 现在你可以这样做:

android { 
    compileOptions.encoding = "UTF-8" 
} 
+0

是的,没有工作。 –

+0

您必须将该块放置在build.gradle顶部的buildscript块中。是你做的吗?? –

+0

我的build.gradle顶部没有'buildscript {}'块,但是当我刚才尝试添加一个时,结果是一样的。下面是我的例子的build.gradle:'应用插件:“java'' 'buildscript { tasks.withType(编译){ options.encoding = “UTF-8” } }' –

1

看起来这将使它构建失败:


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

不知道是否有其他后果,但是,我会放弃它。

1
//ignoreFailures = true 

如果你希望它失败,插入和取消注释上面的行,把这个语句放在下面的部分,看它是否工作。

tasks.withType(Compile) { 
    options.debug = true 
    options.compilerArgs = ["-g"] 
    } 
相关问题