【问题标题】:Is there a way to invoke a java code (something like custom maven plugins) in bazel build?有没有办法在 bazel 构建中调用 java 代码(类似于自定义 maven 插件)?
【发布时间】:2020-12-10 21:14:25
【问题描述】:

我制作了一个插件来在编译 maven 模块时运行它。但是由于我的组织现在正在迁移到 bazel -- 我们有没有办法可以直接在 bazel 中运行插件(mojos)?

如果没有,有没有办法在 bazel 构建 java 代码时调用另一个包含所有项目信息的 java 代码,就像 mojos 中的 MavenProject 参数一样?

【问题讨论】:

  • 你的插件是做什么的?
  • maven模块相关的插件有哪些:I made a plugin to run it during compilation of maven modules?我怀疑你是否可以在 Bazel 中执行 mojo,因为据我所知 bazel 主要是用 C/C++ 实现的?
  • 特别是,您的插件是否修改或生成文件?
  • 生成文件。

标签: java maven bazel


【解决方案1】:

您可以将genrulejava_binary 一起作为tool 用于您的插件。像这样的:

java_binary(
    name = "my_plugin",
    ...
)

genrule(
    name = "run_plugin",
    srcs = [],
    cmd = "$(location my_plugin) > \"$@\"",
    outs = ["plugin_output"],
    tools = [":my_plugin"],
)

在此示例中,您应该能够使用 bazel build :plugin_output 运行您的插件。

【讨论】:

  • 我想获取执行它的模块的类加载器(urlclassloader 也可以,但我需要知道模块的运行时依赖项)。 genrule 会提供给我吗?
  • 这个例子只是使用 genrule 中的java -jar 执行你的插件,所以它会给你任何java -jar 通常给你的东西,我猜。
  • 那你能再澄清一下吗?你需要什么模块的运行时依赖?您的插件正在作用的那个还是插件本身?知道 Bazel deps 就足够了吗?您是在谈论 Java 9 模块还是其他一些概念?
  • 如果您也可以分享插件的用途,这可能会有所帮助。
  • 我使用的是 java 8。基本上,我想让所有运行时依赖项在所有模块上使用反射,然后根据具有注释的类生成几个文件。
【解决方案2】:

听起来您可能想尝试的是java_plugin,它用于运行带有java_binaryjava_library 的注释处理器: https://docs.bazel.build/versions/master/be/java.html#java_plugin

并且您使用java_binaryjava_libraryplugins 属性指定插件: https://docs.bazel.build/versions/master/be/java.html#java_binary.plugins

java_binary(
  name = ...,
  srcs = ...,
  deps = ...,
  plugins = [":my_plugin"],
)

java_plugin(
  name = "my_plugin",
  srcs = ...,
  deps = ...,
  processor_class = "...",
)

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2017-04-23
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多