如何从下载的jar中提取资源

时间:2018-07-15 13:19:29

标签: bazel

我想从jar中提取一些特定的资源(然后将其下载为http存档的一部分),虽然我知道如何实现这一点,但我不知道什么是最轻巧和最少的方法为此。

我已经天真地尝试过(在阅读this答案之后)做类似的事情:

new_http_archive(
    name="some_jar_contents",
    url="@some_archive//:lib/some_jar.jar",
    build_file_content="""
      filegroup(
          name = "srcs",
          srcs = glob(["*"]),
          visibility = ["//visibility:public"]
      )
    """
)

但是,我可以预见的是java.net.MalformedURLException: no protocol:

1 个答案:

答案 0 :(得分:2)

您遇到的问题是由于Bazel无法理解网址@some_archive//:lib/some_jar.jar
它无法推断用于获取Jar的协议,并且会引发异常。

规则new_http_archive用于从某个远程位置获取压缩的存档,然后将其构建并公开为当前存储库的外部目标。

您需要将url参数更改为实际URL,以便让Bazel使用您要提取的资源来获取Jar。
然后,在build_file_content参数部分,使用genrule移动所需的资源文件并导出。

可以找到一个有效的示例in this private gist

该示例执行以下操作:

  • WORKSPACE中获取AutoValue的罐子
  • 使用genrule从Jar中提取autovalue.vm文件
  • 具有一个Python程序,该程序可以读取和打印autovalue.vm的内容

有用的资源: