【问题标题】:java_toolchain: how can I use the Eclipse compiler in a Bazel buildjava_toolchain:如何在 Bazel 构建中使用 Eclipse 编译器
【发布时间】:2021-10-06 09:45:16
【问题描述】:

我想将 ant 构建迁移到 Bazel 4.2.1。 ant 构建使用 Eclipse 编译器 (ecj-3.27.0)。

在 Bazel 中声明 Java 编译器的方式是java_toolchain

所以我查看了bazel query @bazel_tools//tools/jdk:all 的输出,并尝试使用原版工具链作为灵感 (bazelisk query --output=build @bazel_tools//tools/jdk:toolchain_vanilla)。

java_toolchain(
  # modified settings
  name = "my-ecj-toolchain", 
  javabuilder = ["@ecj//:ecj.jar"], # my Eclipse compiler jar
  target_version = "8",
  # prevent ecj.jar's error message 'unknown option --persistent_workers' 
  javac_supports_workers = False,
  # prevent ecj.jar's error message 'unknown option --persistent_workers' 
  javac_supports_multiplex_workers = False, 

  # keeping most vanilla-toolchain settings
  bootclasspath = ["@bazel_tools//tools/jdk:platformclasspath"],
  misc = ["-XDskipDuplicateBridges=true", "-XDcompilePolicy=simple", "-g", "-parameters"],
  jvm_opts = [],
  tools = ["@bazel_tools//tools/jdk:javac_jar", "@bazel_tools//tools/jdk:java_compiler_jar", "@bazel_tools//tools/jdk:jdk_compiler_jar"],
  singlejar = ["@bazel_tools//tools/jdk:singlejar"],
  forcibly_disable_header_compilation = True,
  genclass = ["@bazel_tools//tools/jdk:genclass"],
  ijar = ["@bazel_tools//tools/jdk:ijar"],
  header_compiler = ["@bazel_tools//tools/jdk:turbine_direct"],
  header_compiler_direct = ["@bazel_tools//tools/jdk:turbine_direct"],
  jacocorunner = "@bazel_tools//tools/jdk:JacocoCoverageFilegroup",
)

但是,它仍然不起作用。 ecj.jar 编译输出未知选项--output

bazel aquery MYTARGET 显示整个编译器命令行(以及更多构建步骤):

 Command Line: (exec external/remotejdk11_linux/bin/java \
    -jar \
    external/ecj/ecj.jar \
    --output \
    bazel-out/k8-opt/bin/[...].jar \
    --native_header_output \
    bazel-out/k8-opt/bin/[...]-native-header.jar \
    --output_manifest_proto \
    bazel-out/k8-opt/bin/[...].jar_manifest_proto \
    --compress_jar \
    --output_deps_proto \
    bazel-out/k8-opt/bin/[...].jdeps \
    --bootclasspath \
    bazel-out/k8-opt/bin/external/bazel_tools/tools/jdk/platformclasspath.jar \
    --sources \
    bazel-out/k8-opt/bin/[...].java \
    --javacopts \
    -target \
    8 \
    '-XDskipDuplicateBridges=true' \
    '-XDcompilePolicy=simple' \
    -g \
    -parameters \
    -g \
    -- \
    --target_label \
    bazel-out/k8-opt/bin/[...]:[...] \
    --strict_java_deps \
    ERROR \
    --direct_dependencies \
[...]

我不知道任何接受--output 的Java 编译器。我必须以其他方式传递ecj.jar 吗?

【问题讨论】:

    标签: bazel bazel-java


    【解决方案1】:

    我不知道任何接受 --output 的 Java 编译器。

    事实上,Bazel 不直接调用 OpenJDK 的 javac 可执行文件,而是调用它自己的封装在 javac 的 API 上,称为 buildjar。 Bazel 文档中有一个little about thisbuildjar 启用了 Bazel 的一些更高级的 Java 功能。

    因此,您必须为 EJC 提供buildjar 兼容的包装器。这种实现最接近的起点可能是VanillaJavaBuilder,它是针对OpenJDK 的javac,在正常的buildjar 实现中没有任何侵入性API 使用。

    【讨论】:

    • 指向正确文档的指针非常有用。但是,我不想编写自己的包装器,而是希望配置 `VanillaJavaBuilder` 以使其使用ecj.jar
    • 不幸的是,考虑到即使 VanillaJavaBuilder 使用 javac API 而不是外壳,我只是看不出这是如何开箱即用的。
    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2018-05-07
    • 2013-06-13
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多