java_toolchain: как я могу использовать компилятор Eclipse в сборке Bazel
Я хочу перенести сборку муравья на Bazel 4.2.1. Сборка ant использует компилятор Eclipse (ecj-3.27.0).
Способ объявления компилятора Java в Bazel:
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",
)
Однако это все равно не работает. компилирует вывод неизвестной опции.
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
по-другому?
2 ответа
Я не знаю компилятора Java, который принимает --output.
В самом деле, Bazel не вызывает исполняемый файл javac OpenJDK напрямую, а скорее создает собственную оболочку для вызываемых API. Об этом немного сказано в документации Bazel; включает некоторые из более причудливых функций Java Bazel.
Итак, вам нужно будет предоставить -совместимую оболочку для EJC. Ближайшая отправная точка для такой реализации, вероятно,VanillaJavaBuilder
, который предназначен для OpenJDK
javac
без какого-либо инвазивного использования API в обычном
buildjar
реализация.
Компилятор Eclipse Java доступен в виде набора инструментов для Bazel.
https://github.com/salesforce/bazel-jdt-java-toolchain
Это превращает ECJ в строителя для «Базэла». Есть несколько ограничений. Например, он еще не поддерживает Error Prone. Однако обработка аннотаций работает.
Мы заметили, что ECJ имеет некоторое преимущество в нашей большой базе кода с точки зрения производительности и потребления ресурсов.