我想将我们的一个java项目从ant迁移到gradle。这个项目有很多程序员编写的源代码。问题是有些文件是用ANSi编码的,有些是用UTF-8编写的(这会产生编译错误)。我知道我可以使用compileJava.options.encoding = 'UTF-8'
设置编码,但这不起作用(并非所有文件都以UTF-8编码)。是否可以禁用编码检查(我不想更改所有文件的编码)?
答案 0 :(得分: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任务,之后就可以删除原始源文件,编译应该可以正常运行而不会出现编码错误。