gradle - 禁用 java gradle 项目中的编码检查

标签 gradle

我想将我们的一个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) header 。

并且 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 任务,之后您就可以删除原始源文件,并且编译应该可以正常工作而不会出现编码错误。

关于gradle - 禁用 java gradle 项目中的编码检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17084727/

相关文章:

gradle - Gradle变量范围

java - 带闭包的 Spock 单元测试以错误 "No runnable methods"结束

java - Gradle:如何在编译后删除类文件

jenkins - 致命 : The Gradle wrapper has not been found in these directories

gradle - 向Gradle exec任务添加参数时没有此类文件或目录

intellij-idea - 如何让 jrebel、jetty、gradle 和 intellij idea 一起工作

android-studio - 安卓工作室 3.6 : Unable to run apk on emulator or device

java - Gradle 包含来自 webapp 目录的 Freemarker 文件

gradle - 次要Gradle升级中断测试编译

android - 所有 com.google.android.gms 库必须使用完全相同的版本