Как я могу использовать инструмент JAR с Bazel v0.19+?

Начиная с Bazel v0.19, если у вас есть код Starlark (ранее известный как «Skylark»), который ссылается на @bazel_tools//tools/jdk:jar, во время сборки вы видите подобные сообщения:

WARNING: <trimmed-path>/external/bazel_tools/tools/jdk/BUILD:79:1: in alias rule @bazel_tools//tools/jdk:jar: target '@bazel_tools//tools/jdk:jar' depends on deprecated target '@local_jdk//:jar': Don't depend on targets in the JDK workspace; use @bazel_tools//tools/jdk:current_java_runtime instead (see https://github.com/bazelbuild/bazel/issues/5594)

Я думаю, что мог бы заставить все работать с @bazel_tools//tools/jdk:current_java_runtime, если бы мне нужен был доступ к команде java, но я не уверен, что мне нужно сделать, чтобы инструмент jar заработал. Содержимое связанной проблемы GitHub, похоже, не решает эту конкретную проблему.


person Matt Passell    schedule 30.10.2018    source источник


Ответы (2)


Я наткнулся на коммит в Bazel, который вносит аналогичную корректировку в правила Java Starlark. Он использует следующий шаблон: (я немного отредактировал код)

# in the rule attrs:
    "_jdk": attr.label(
        default = Label("//tools/jdk:current_java_runtime"),
        providers = [java_common.JavaRuntimeInfo],
    ),

# then in the rule implementation:
    java_runtime = ctx.attr._jdk[java_common.JavaRuntimeInfo]
    jar_path = "%s/bin/jar" % java_runtime.java_home
     ctx.action(
         inputs = ctx.files._jdk + other inputs,
         outputs = [deploy_jar],
         command = "%s cmf %s" % (jar_path, input_files),
     )

Кроме того, java доступен в str(java_runtime.java_executable_exec_path) и javac в "%s/bin/javac" % java_runtime.java_home.

См. также запрос на вытягивание с более простым примером.

person Rodrigo Queiro    schedule 30.10.2018
comment
Спасибо. Я вижу в этом логику. Я попробую это сегодня и приму это, пока это работает. :) - person Matt Passell; 31.10.2018
comment
Пытаюсь понять, что с этим делать... Это похоже на правильный подход, когда у вас есть правило на верхнем уровне. В моем случае у меня есть макрос с genrule прямо внутри него, поэтому решение немного другое. Вот что я сделаю: я добавлю это как отдельный ответ. Если вы готовы взять его и включить в свой, я просто удалю свой ответ. - person Matt Passell; 31.10.2018

Поскольку моя ссылка на инструмент jar находится внутри правила макроса верхнего уровня, а не правила, я не смог использовать подход из ответа Родриго. Вместо этого я явно сослался на цепочку инструментов current_java_runtime и затем смог использовать JAVBASE make переменная в качестве базового пути для инструмента jar.

native.genrule(
    name = genjar_rule,
    srcs = [<rules that create files being jar'd>],
    cmd = "some_script.sh $(JAVABASE)/bin/jar $@ $(SRCS)",
    tools = ["some_script.sh", "@bazel_tools//tools/jdk:current_java_runtime"],
    toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"],
    outs = [<some outputs>]
)
person Matt Passell    schedule 31.10.2018