用Bazel包装独立的罐子

用Bazel包装独立的罐子,bazel,Bazel,我正在尝试构建一个相对独立的发布包(假设它是一个tarball,但也可以是一个RPM/Deb),它既包含我的代码(打包到一个jar中),也包含我的代码在编译和运行时使用的jar。(假设为了简单起见,它们是相同的集合。) 我有一个MyPackage(它有一堆.java文件),假设它直接依赖于外部jar a和B,B依赖于外部jar C。我从maven_jar得到a、B和C 我已经制定了如下规则: 在MyPackage/BUILD中: java_library( name = "MyPacka

我正在尝试构建一个相对独立的发布包(假设它是一个tarball,但也可以是一个RPM/Deb),它既包含我的代码(打包到一个jar中),也包含我的代码在编译和运行时使用的jar。(假设为了简单起见,它们是相同的集合。)

我有一个MyPackage(它有一堆.java文件),假设它直接依赖于外部jar a和B,B依赖于外部jar C。我从maven_jar得到a、B和C

我已经制定了如下规则:

在MyPackage/BUILD中:

java_library(
    name = "MyPackage",
    srcs = glob(["src/main/java/**/*.java"]),
    deps = ["//MyPackage/artifacts:compile_jars"],
)
在MyPackage/artifacts/BUILD中:

java_library(
    name = "compile_jars",
    visibility = ["//MyPackage:__pkg__"],
    exports = ["libdeps_A", "libdeps_B"]
)
java_library(
    name = "libdeps_A",
    exports = ["@org.someone.A//jar"],
)
java_library(
    name = "libdeps_B",
    exports = ["@org.secondparty.B//jar", ":libdeps_C"],
)
java_library(
    name = "libdeps_C",
    exports = ["@org.thirdperson.C//jar"],
)
但是,构建的libMyPackage.jar(如预期的那样)不包含libdeps_u3;[ABC]中的文件,它只包含MyPackage的src/main/java中的.class文件

我成功地使用了另一条规则:MyPackage将其放入tarball的lib/dir中

我的问题是,是否有某种方法来解决遍历//MyPackage/artifacts时产生的文件集(jar):编译_jars规则,这样我也可以将它们放入tar归档中

这似乎与java_二进制文件的_deploy.jar隐式输出目标非常相似。不过,我不认为我可以使用它,因为我的切入点没有“主”例程。(正在使用谷歌Play的onStart)

我当然可以编写一些自动化程序来实现另一种形式的//MyPackage/artifacts:利用MyPackage/artifacts/BUILD中的信息编译jars目标,但我想知道我是否在重新发明轮子


谢谢,肖恩,就我所知,没有一个通用的工具可以做到这一点

我们遇到了完全相同的问题(我们创建了一个jar球,其中包含主jar、完整的可传递闭包、配置文件和其他内容)——我们最终编写了自己的解决方案,它的灵感来自于(但是从头开始编写的,因为我们需要其他功能,不需要它们的一些功能,我们更喜欢scala)

作为另一个参考,您可以看到rules_scala(),它在skylark中实现了一个部署jar(可能它比本机规则更容易从中复制)

指示此问题未解决的另一个提示是bazel问题: