私は、ISO-8859-1文字エンコーディングを使っていくつかのソースファイルを保存している外部ソースリポジトリを持っています。 Bazelから呼び出されたときにjavacをデフォルトのUTF-8からISO-8859-1に変更するのに問題があります。Bazel:java_library javacoptsによる文字エンコーディングは機能しませんか?
私はBazelを介して外部のリポジトリを取得していますし、フェッチされたファイルの文字コードを判別することができます
> cd bazel-PROJECT/external/third-party/src
> file -i LibraryCode.java
LibraryCode.java: text/x-c; charset=iso-8859-1
Bazelのjava_libraryを経由して外部ソースを構築する、またはから直接のjavacを介して外部のリポジトリのソースファイルをコンパイルしようとしますコマンドラインは、(予想)で失敗します。Bazelによってフェッチされた外部のリポジトリファイルに対してコマンドラインから使用する場合のjavacの-encoding引数を使用しようと
error: unmappable character for encoding UTF8
は、コンパイルの問題を解決します:
> javac -encoding iso-8859-1 LibraryCode.java
しかし、Bazelを介してjavacに正常に-encodingオプションを渡すことができませんでした。
私がこれまで試した:
- は、エンコードISO-8859-1とのルールをjava_toolchain宣言し、それを使用してBazelのコマンドラインから
- を--javacopt設定java_libraryルールでjavacopts
- を設定Bazelのコマンドラインから--java_toolchainを使用します。
これらの試みはいずれも、文字セットの不一致およびコンパイラエラーを回避しませんでした。
1)repository_rule BUILD_FILEは:
> bazel build --javacopt="-encoding iso-8859-1" target
3)符号化設定で定義するJavaツールチェーンターゲット:
java_toolchain(
name = "toolchain",
bootclasspath = ["@bazel_tools//tools/jdk:bootclasspath"],
encoding = "iso-8859-1",
extclasspath = ["@bazel_tools//tools/jdk:extdir"],
forcibly_disable_header_compilation = 0,
genclass = ["@bazel_tools//tools/jdk:GenClass_deploy.jar"],
header_compiler = ["@bazel_tools//tools/jdk:turbine_deploy.jar"],
ijar = ["@bazel_tools//tools/jdk:ijar"],
javabuilder = ["@bazel_tools//tools/jdk:JavaBuilder_deploy.jar"],
javac = ["@bazel_tools//third_party/java/jdk/langtools:javac_jar"],
javac_supports_workers = 1,
jvm_opts = [
"-XX:+TieredCompilation",
"-XX:TieredStopAtLevel=1",
],
misc = [
"-XDskipDuplicateBridges=true",
],
singlejar = ["@bazel_tools//tools/jdk:SingleJar_deploy.jar"],
source_version = "8",
target_version = "8",
visibility = ["//visibility:public"]
)
すべて
java_library(
name = "thirdparty",
srcs = glob(["src/**/*.java"]),
javacopts = ["-encoding iso-8859-1"],
visibility = ["//visibility:public"]
)
2)Bazelコマンドラインをthirdparty.BUILDエラーで終わる:UTF8をエンコードするためのマップできない文字。
Bazelでjavacエンコーディングを設定する際に間違いは何ですか?
外部リポジトリのソースファイルをiconvで変換することで問題を回避できますが、javacのエンコーディング設定を使って解決することをお勧めします。認識し得ていない
フォローアップ
java_toolchainエンコーディングはバグのように見えます。私はBazelのローカルコピーでこのための予備的な修正をしました - charsetを変更するjava_toolchainのアプローチ(上記のオプション#3)が動作するようです。この問題とでは、提案の修正追跡
お返事ありがとうございます。 以前はツールチェーン定義を使用しようとしましたが、成功しませんでした。私はもう一度やり直しましたが、それでも問題を解決することはできませんでした。 私は、何が間違っているのかを見るためにソースコードを検査しようとしていないというアイデアがありません。 –
あなたのユースケースを動作させることができるかどうかを見るためのリポジトリはありますか? –
私は何を設定できるかを見ていきます(レガシーレポはsvnにあり、私はsvn repository_ruleのカスタム拡張を持っています)。 一方、私はjava_common.compile()を使って遊んで、-encodingオプションと一緒に使用すると、sun。*パッケージからの不正な引数例外を除いて例外スタックトレースを取得できました。 https://github.com/bazelbuild/bazel/commit/3c5e55ff8e058b624ce26e803ff00434c70d4b91ここにもバグが報告されています。https://github.com/bazelbuild/bazel/issues/2606 Sun Javac APIのgetTask()は、BASICグループ内のオプションだけを受け入れます。他のすべては除きます。 –