如何在ctx.actions.run中更改Java可执行文件的类路径?

时间:2018-03-20 22:22:56

标签: bazel

在我的基于Java的Bazel项目中,我使用了用Java编写的代码生成器。生成器是根项目的一部分,也用于子项目。

我想要实现的是包含根项目的输出(.jar文件)作为子项目中代码生成的依赖项,以授予代码生成器对根项目的所有编译文件的访问权限(通过classpath)。 Bazel有可能吗?

我看到的是,子项目中密钥生成的类路径只包含代码生成器二进制文件的依赖项(//父代:下面脚本中的SettingsGenerator)。

在我的自定义规则中,我基本上像这样调用代码生成器:

def _generate_settings(ctx):
    ...
    ctx.actions.run(
        inputs = [ctx.file._src] + [ctx.files.deps],
        outputs = [keys, settings, loader],
        mnemonic = "GenKeysAndSettings",
        arguments = [args],
        executable = ctx.executable._tool,
    )
    return [DefaultInfo(
        files=depset([keys, settings, loader]),
        runfiles=ctx.runfiles(files=ctx.files.deps)
    )]

gen_settings = rule(
    implementation = _generate_settings,
    attrs = {
        "lang": attr.string(),
        "deps": attr.label_list(
            allow_files = True
        ),
        "_tool": attr.label(
            cfg = "host",
            executable = True,
            default = Label("//parent:SettingsGenerator"),
        ),
        "_src": attr.label(
            single_file = True,
            default = Label("//parent:Name")
        ),
    }
)

父项目BUILD:

load("//parent:settings.bzl", "gen_settings")

gen_settings(
    name = "GenerateSettings",
    lang = ""
)
java_library(
    name = "parent",
    srcs = glob(["src/main/java/**/*.java"]) + [
        ":GenerateSettings",
    ],
    ...
)
java_binary(
    name = "SettingsGenerator",
    srcs = glob(["src/main/java/**/SettingsGenerator.java"]),
    main_class = "my.company.SettingsGenerator",
    ...
)

儿童项目BUILD:

gen_settings(
    name = "GenerateSettings",
    lang = "Java",
    deps = ["//parent"]
)
...

我的解决方法是将.jar文件作为输入包含在内,并在生成器中使用自定义类加载器。但是如果我可以直接从Bazel控制类路径那就太好了。

任何帮助将不胜感激。谢谢。

0 个答案:

没有答案