You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用rules_scala+Bazel,如何打包scala_library导出的传递JAR而非完整_deploy.jar?

解决方案:构建包含主源码与导出项的JAR

针对你的需求,有两种简便的折中方案可以实现目标:

方案一:调整依赖结构结合自定义java_binary

  1. 修改原scala_library的依赖配置,将非导出的依赖(C、D)移至runtime_deps,保留deps和exports中的导出项(A、B):
scala_library(
    name = "my_favorite_scala_library",
    srcs = glob(["*.scala"]),
    exports = [
        "A",
        "B",
    ],
    deps = [
        "A",
        "B",
    ],
    runtime_deps = [
        "C",
        "D",
    ],
)
  1. 添加一个空的java_binary目标(仅用于生成打包JAR,主类可填任意占位值):
java_binary(
    name = "my_library_with_exports",
    main_class = "dummy.Main",
    runtime_deps = [":my_favorite_scala_library"],
)
  1. 执行构建命令:
bazel build //path/to/my/library:my_library_with_exports_deploy.jar

生成的JAR会包含你的主源码以及exports指定的A、B,但不会包含runtime_deps中的C、D。

方案二:直接用scala_binary打包(更简洁)

如果你的库可以接受以二进制目标形式打包,直接修改目标类型:

scala_binary(
    name = "my_favorite_scala_library",
    srcs = glob(["*.scala"]),
    main_class = "your.actual.Main", # 有主类填实际路径,无则填占位值如dummy.Main
    exports = [
        "A",
        "B",
    ],
    deps = [
        "A",
        "B",
    ],
    runtime_deps = [
        "C",
        "D",
    ],
)

构建对应的_deploy.jar:

bazel build //path/to/my/library:my_favorite_scala_library_deploy.jar

同样能得到仅包含主源码和导出项的JAR。

核心逻辑

Bazel的deploy.jar会打包目标的**编译依赖(deps)**和自身源码,而runtime_deps仅用于运行时,不会被纳入打包范围。通过将非导出依赖移至runtime_deps,就能实现只保留主源码与导出项的折中打包效果。

内容的提问来源于stack exchange,提问作者Frank P.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:57:08