2017-09-01 51 views
0

我想构建一个相对独立的发布包(假设它是一个tar包,但可能是一个RPM/Deb),它包含我的代码(它被打包成一个jar),以及我的代码被编译并在运行时使用的jar。 (假设这些都是简单的设置)与Bazel包装相关的瓶子

我有MyPackage(它有一堆.java文件),我们说它直接取决于外部的瓶子A和B,而B取决于外部罐子C.我从maven_jars中获得A,B和C.

我已经设置了规则是这样的:

在MyPackage的/ BUILD:

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

和MyPackage的/文物/ 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_ [ABC]中的文件,它只包含MyPackage的src/main/java中的.class文件。

我有另一个成功使用的规则:MyPackage把它放在我的tarball的lib/dir中。

我的问题是,如果有办法解决来自遍历// MyPackage/artifacts:compile_jars规则的文件集(jar),那么我也可以将它们放入tar归档文件中。

这看起来与java_binary的_deploy.jar隐式输出目标非常类似。但我认为我不能使用它,因为我的入口点没有“主要”例程。 (它使用onStart从谷歌播放)

我当然可以写一些自动化,将使另一种形式的/ MyPackage/artifacts:compile_jars目标出MyPackage/artifacts/BUILD中的信息,但我不知道我是否重新发明轮子?

谢谢,肖恩

回答

1

据我所知没有这样做一个ubiquotous工具。

我们有完全相同的问题(我们创建了一个包含主jar,完整传递闭包,配置文件等的jar球) - 我们最终做的是编写我们自己的解决方案,其灵感来自JarCreator (但是从头开始编写,因为我们需要其他功能,并且不需要它们的某些功能,我们更喜欢scala)。

作为另一个参考,您可以看到在skylark中实现部署jar的rules_scala(_build_deployable)(推测复制起来比原生规则更容易)。

另一个提示表明这个问题未解决是这个bazel问题:Add zip directory skylark action