当前位置: 首页 > 知识库问答 >
问题:

java_toolchain:如何在Bazel构建中使用Eclipse编译器

夏侯浩气
2023-03-14

我想将ant构建迁移到Bazel4.2.1。ant构建使用Eclipse编译器(ECJ-3.27.0)。

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

因此,我查看了bazel query@bazel_tools//tools/jdk:all的输出,并尝试使用vanilla工具链作为灵感(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",
)

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 \
[...]

我不知道有哪个Java编译器接受--output。是否必须以不同的方式传递ecj.jar

共有1个答案

顾俊茂
2023-03-14

我不知道有哪个Java编译器接受--output。

实际上,Bazel并不直接调用OpenJDK的javac可执行文件,而是调用其在javac名为buildjar的API上的包装器。在Bazel文档中有一些关于这一点的内容;buildjar支持Bazel的一些更好的Java特性。

因此,您必须为EJC提供与buildjar兼容的包装器。这种实现最接近的起点可能是VanillaJavaBuilder,它用于OpenJDK的javac,而不是在普通的buildjar实现中使用任何侵入性的API。

 类似资料:
  • null 看起来bazel在cc_test和android toolchain上有问题 有什么方法可以使用Bazel为android构建和运行一个可执行文件吗?也许我错过了一些命令行参数 编辑:

  • 本文向大家介绍使用Bazel编译TensorBoard教程,包括了使用Bazel编译TensorBoard教程的使用技巧和注意事项,需要的朋友参考一下 1.TensorBoard Tensorboard是一套用于查看和理解TensorFlow运行情况的工具,有时可能现有的功能并不能满足我们当前的需求,那么则需要我们对Tensorboard进行定制化开发,定制化的第一步就是编译源码。 TensorB

  • 问题内容: 我有一个项目,我现在开始作为Maven项目,但是由于某种原因,它无法正常工作。这是我的pom.xml: 问题答案: 实际上,您的POM看起来有点奇怪: 它缺少Webapp项目的权利。 Maven War插件配置看起来不正确,您只是不需要添加的额外内容。 这是最小pom的样子: 因此,要么修改它,然后更新项目配置( 右键单击 您的项目,然后 右键单击 Maven >更新项目配置)。 或者

  • 在NodeJS项目中使用Bazel最简单的方法是什么,有些项目可能是用其他语言编写的?另外,是否有一个例子在某处Bazel被用于多回购设置? 谢了!

  • 问题内容: 我需要使用已“定制”的特殊JRE批处理编译。 Eclipse可以使用此JRE编译类,但是我需要在Eclipse之外制作一个构建脚本。 Eclipse使用什么方法在没有JDK的情况下生成.class文件? 问题答案: Eclipse具有其自己的编译器,其原因如下: 增量编译(可以仅编译项目的更改部分,这可能意味着比刚刚保存的文件数量更多,例如,当您更改某些全局变量时) 即使代码包含错误,

  • webpack配置 下图是采用 Mpx 开发小程序时,一个简短的 webpack 配置。配置说明可参考图中注释以及子项说明。 module.exports = { entry: { app: resolveSrc('app.mpx') }, output: { // 和 webpack 配置一致,编译后文件输出的路径 path: resolveDist(),