2

Java プロジェクトの 1 つを ant から gradle に移行したいと考えています。このプロジェクトには、少数のプログラマーによって書かれた多くのソース コードがあります。問題は、一部のファイルが ANSi でエンコードされ、一部が UTF-8 でエンコードされていることです (これにより、コンパイル エラーが発生します)。を使用してエンコードを設定できることはわかっていますcompileJava.options.encoding = 'UTF-8'が、これは機能しません (すべてのファイルが UTF-8 でエンコードされているわけではありません)。エンコーディング チェックを無効にすることはできますか (すべてのファイルのエンコーディングを変更したくありません)。

4

1 に答える 1

2

これは Gradle の問題ではなく、javac の問題です。ただし、以下で説明するように、gradle ビルドで 1 回限りの groovy スクリプトを実行することで、この問題を解決できます。

通常、build.gradle ファイルに次の行を追加するだけで済みます。

compileJava.options.encoding = 'UTF-8'

ただし、一部のテキスト エディターでは、ファイルを UTF-8 で保存すると、テキスト ファイルの先頭にバイト オーダー マーク (BOM) ヘッダーが生成されます。

また、 javac は encoding=" " オプションを指定してコンパイルした場合でも BOM を認識しないため、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 タスクを 1 回実行するだけで、その後は元のソース ファイルを削除でき、エンコード エラーが発生することなくコンパイルが機能するはずです。

于 2014-02-24T18:14:14.800 に答える