2017-09-01 80 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