2

我想将我们的一个 java 项目从 ant 迁移到 gradle。这个项目有很多由少数程序员编写的源代码。问题是有些文件是用 ANSI 编码的,有些是用 UTF-8 编码的(这会产生编译错误)。我知道我可以使用设置编码,compileJava.options.encoding = 'UTF-8'但这不起作用(并非所有文件都以 UTF-8 编码)。是否可以禁用编码检查(我不想更改所有文件的编码)?

4

1 回答 1

2

这不是 Gradle 的问题,而是 javac 的问题。但是,您可以在 gradle 构建中运行一次性 groovy 脚本来解决此问题,如下所述。

通常,您只需要在 build.gradle 文件中添加以下行:

compileJava.options.encoding = 'UTF-8'

但是,某些文本编辑器在将文件保存为 UTF-8 时会在文本文件的开头生成一个字节顺序标记 (BOM) 标头。

而且 javac 不理解 BOM,即使您使用 encoding=" UTF-8" 选项编译也不理解,因此您可能会收到如下错误:

> javac -encoding UTF8 Test.java

Test.java:1: error: illegal character: \65279
?class Test {

您需要从源文件中剥离 BOM 或将源文件转换为另一种编码。例如, Notepad++可以将文件编码从一种转换为另一种。

对于大量源文件,您可以轻松地在 Groovy/Gradle 中编写一个简单的任务来打开源文本文件并转换 UTF-8,如果找到,则从第一行删除 BOM 前缀。

将此添加到您的 build.gradle 并运行 gradle convertSource

task convertSource << {
    // convert sources files in source set to normalized text format
    sourceSets.main.java.each { file ->
        // read first "raw" line via BufferedReader     
        def r = new BufferedReader(new FileReader(file))
        String s = r.readLine()
        r.close()
        // get entire file normalized
        String text = file.text
        // get first "normalized" line
        String normalizedLine = new StringReader(text).readLine()
        if (s != normalizedLine) {
            println "rename: $file"
            File target = new File(file.getParentFile(), file.getName() + '.bak')
            if (!target.exists()) {
              if (file.renameTo(target))
                file.setText(text)
              else
                println "failed to rename or target already exists"
            }                
        }
    }
} // end task

convertSource 任务将简单地枚举所有源文件,从每个源文件中读取第一个“原始”行,然后读取规范化的文本行并比较第一行。如果第一行不同,那么它将输出一个带有规范化文本的新目标文件并保存原始源的备份。只需运行一次 convertSource 任务,之后您就可以删除原始源文件,并且编译应该可以正常工作而不会出现编码错误。

于 2014-02-24T18:14:14.800 回答