2017-04-16 55 views
1

我有一个外部源代码库,显然使用ISO-8859-1字符编码存储一些源文件。当通过Bazel调用javac时,我无法从默认的UTF-8更改为ISO-8859-1。Bazel:通过javacopts的java_library字符编码不工作?

我获取通过巴泽勒外部存储库,并能确定获取文件的字符集:

> cd bazel-PROJECT/external/third-party/src 
> file -i LibraryCode.java 
LibraryCode.java: text/x-c; charset=iso-8859-1 

通过巴泽尔的java_library构建外部来源,或试图直接通过的javac编译外部库的源文件在命令行失败,(预计):

error: unmappable character for encoding UTF8 

试图使用javac的-encoding参数对从由巴泽尔获取外部库文件中的命令行中使用的解决问题的编译:

> javac -encoding iso-8859-1 LibraryCode.java 

但是,我一直无法通过Bazel将-encoding选项成功传递给javac。

我试过到目前为止:

  1. 设置javacopts在java_library规则
  2. 从巴泽尔的命令行
  3. 设置--javacopt声明java_toolchain与编码ISO-8859-1的规则,并用它使用Bazel命令行中的--java_toolchain。

这些尝试都没有解决字符集不匹配和编译器错误。

1)repository_rule build_file:thirdparty.BUILD

java_library(
    name = "thirdparty", 
    srcs = glob(["src/**/*.java"]), 
    javacopts = ["-encoding iso-8859-1"], 
    visibility = ["//visibility:public"] 
) 

2)巴泽勒命令行:

> 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"] 
) 

所有最终出现错误:编码UTF8的不可映射字符。

我在通过Bazel设置javac编码时犯的错误是什么?

我可以尝试通过iconv转换外部存储库源文件来解决此问题,但我更愿意按照预期通过javac的编码设置来解决此问题。没有得到认可

跟进

的java_toolchain编码似乎是一个错误。我已经在我的本地Bazel副本上进行了初步修复 - java_toolchain更改charset(上面的选项#3)方法似乎可行。

追踪这个问题,并在建议修复:#2926

回答

1

不幸的是,在命令行/目标基于这样做没有什么好办法。你必须写一个java_toolchain并指向它。推导one from bazel这将导致:

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", 
) 

(你可能希望将singlejar目标更改为C++二进制性能原因:@bazel_tools//tools/jdk:singlejar IIRC)

然后你就可以指向工具链与--java_toolchain=//my:toolchain(见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组中的选项,排除其他所有选项。 –