【问题标题】:How to specify java META-INF directory and services in bazel?如何在 bazel 中指定 java META-INF 目录和服务?
【发布时间】:2022-08-10 08:55:53
【问题描述】:

我正在尝试提供我自己的System.LoggerFinder 实现,据我所知,我必须在某些资源文件/resources/META-INF/services/java.lang.System$LoggerFinder 中指定类。

现在我的实现位于它自己的包中(包括构建文件和java_library() 作为规则),这与我的java_binary() 所在的包和BUILD 文件不同。我将实现作为deps 添加到BUILD 文件中二进制文件并使用//visibility:public 确保包可见,只是为了确保这不是问题。我尝试将上述文件放入它们两个中,并使用resources = [\"resources/META-INF/services/java.lang.System$LoggerFinder\"]将其指定为相应BUILD文件中的资源文件,但bazel总是抱怨要么

  • 文件\'//:resources/META-INF/services/java.lang.System$LoggerFinder\' 丢失,
  • 或者,如果我改用 resources = [\"//resources/META-INF/services/java.lang.System$LoggerFinder\"],则资源目录缺少 BUILD 文件。

所以基本上我的问题是:我必须将资源放在哪里以及如何指定它们?如果我必须将 BUILD 文件添加到资源中,我应该使用什么规则?

谢谢!

    标签: java bazel bazel-java


    【解决方案1】:

    一种方法是使用 META-INF 文件夹中的文件创建一个 jar 文件,并将其添加为 java_library 的依赖项。 jar 的内容应该被合并进去。像这样的东西:

    java_library(
      name = "lib",
      srcs = [...],
      deps = [":meta_inf_import"],
    )
    
    java_import(
      name = "meta_inf_import",
      jars = [":meta_inf.jar"],
    )
    
    genrule(
      name = "gen_meta_inf",
      srcs = ["java.lang.System$LoggerFinder"],
      outs = ["meta_inf.jar"],
      cmd = """
    mkdir -p META-INF/services
    cp $< META-INF/services/
    jar -cf $@ .
    """,
    )
    

    【讨论】:

      猜你喜欢
      • 2014-08-14
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      相关资源
      最近更新 更多