2017-04-16 12 views
1

私は、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オプションを渡すことができませんでした。

私がこれまで試した:

  1. は、エンコードISO-8859-1とのルールをjava_toolchain宣言し、それを使用してBazelのコマンドラインから
  2. を--javacopt設定java_libraryルールでjavacopts
  3. を設定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)が動作するようです。この問題とでは、提案の修正追跡

#2926

答えて

1

は、残念ながら、コマンドライン/ターゲットからベースのことを行うには良い方法はありません。 java_toolchainと書いて、それを指し示す必要があります。そして、あなたは--java_toolchain=//my:toolchainとそのツールチェーンを指すことができ

(参照:(@bazel_tools//tools/jdk:singlejar IIRCあなたは、パフォーマンス上の理由のためのC++バイナリにsinglejarターゲットを変更したい場合があります)

java_toolchain(
    name = "toolchain", 
    bootclasspath = ["@bazel_tools//tools/jdk:bootclasspath"], 
    encoding = "iso-8859-1", 
    extclasspath = ["@bazel_tools//tools/jdk:extclasspath"], 
    forcibly_disable_header_compilation = 0, 
    genclass = ["@bazel_tools//tools/jdk:genclass"], 
    header_compiler = ["@bazel_tools//tools/jdk:turbine"], 
    ijar = ["@bazel_tools//tools/jdk:ijar"], 
    javabuilder = ["@bazel_tools//tools/jdk:javabuilder"], 
    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", 
) 

:につながるone from bazelの導出java_toolchain flag

+0

お返事ありがとうございます。 以前はツールチェーン定義を使用しようとしましたが、成功しませんでした。私はもう一度やり直しましたが、それでも問題を解決することはできませんでした。 私は、何が間違っているのかを見るためにソースコードを検査しようとしていないというアイデアがありません。 –

+0

あなたのユースケースを動作させることができるかどうかを見るためのリポジトリはありますか? –

+0

私は何を設定できるかを見ていきます(レガシーレポは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グループ内のオプションだけを受け入れます。他のすべては除きます。 –

関連する問題