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