在java gradle项目中禁用编码检查

在java gradle项目中禁用编码检查,gradle,Gradle,我想将我们的一个java项目从ant迁移到gradle。这个项目有很多由少数程序员编写的源代码。问题是有些文件是用ANSi编码的,有些是用UTF-8编码的(这会产生编译错误)。我知道我可以使用compileJava.options.encoding='UTF-8'设置编码,但这不起作用(并非所有文件都以UTF-8编码)。是否可以禁用编码检查(我不想更改所有文件的编码)?这不是Gradle的问题,而是javac的问题。但是,您可以在gradle构建中运行一次性groovy脚本来解决这个问题,如下所

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

这不是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表,或将源文件转换为其他编码。例如,您可以将文件编码从一种转换为另一种

对于许多源文件,您可以轻松地在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
任务源
//通过BufferedReader读取第一个“原始”行
def r=新的BufferedReader(新的文件读取器(文件))
字符串s=r.readLine()
r、 关闭()
//使整个文件正常化
String text=file.text
//获取第一个“标准化”行
String normalizedLine=新的StringReader(text).readLine()
如果(s!=normalizedLine){
println“重命名:$file”
文件目标=新文件(File.getParentFile(),File.getName()+'.bak')
如果(!target.exists()){
if(file.renameTo(目标))
file.setText(文本)
其他的
println“重命名失败或目标已存在”
}                
}
}
}//结束任务
convertSource任务将简单地枚举所有源文件,从每个源文件中读取第一个“原始”行,然后读取规范化文本行并比较第一行。如果第一行不同,那么它将输出一个带有规范化文本的新目标文件,并保存原始源文件的备份。只需运行convertSource任务一次,然后就可以删除原始源文件,编译应该可以正常运行,不会出现编码错误