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

sbt publishLocal发布含provided依赖的库,下游项目无法继承该依赖

问题描述

我有两个Scala SBT项目,需求是实现Spark依赖的单一声明并保留provided标记:

1. internal-library项目配置

该项目是内部复用库,包含通用代码与依赖,通过sbt clean publishLocal发布到本地仓库,其build.sbt配置如下:

organization := "com.foo"
name := "internal-library"
version := "1.0.0"
scalaVersion := "2.13.13"

// 其他配置...

libraryDependencies += "com.mysql" % "mysql-connector-j" % "8.0.32"
libraryDependencies += "com.clickhouse" % "clickhouse-jdbc" % "0.4.6"

// 其他依赖...

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "3.5.1" % "provided",
  "org.apache.spark" %% "spark-sql" % "3.5.1" % "provided"
)

2. abc项目配置

abc项目依赖internal-library,其build.sbt配置如下:

organization := "com.foo"
name := "abc"
version := "1.0.0"
scalaVersion := "2.13.13"

// 其他配置...

libraryDependencies += "com.foo" %% "internal-library" % "1.0.0"

当前问题

internal-library中除标记为provided的Spark依赖外,其余所有依赖都能在abc项目中编译可见并正常使用。目前我需要在abc项目中重复添加Spark依赖,但希望仅在internal-library中声明一次Spark依赖,同时在abc项目中保留其provided标记——因为Spark集群已自带相关JAR包,无需将其打包到abc项目的胖JAR中。

解决方案

方法:显式引入依赖项目的provided配置依赖

由于SBT/Maven默认不会传递provided scope的依赖,我们可以在abc项目中显式引入internal-library的provided配置依赖,并将其映射到自身的provided scope:

修改abc项目的build.sbt,添加以下内容:

// 原有核心依赖
libraryDependencies += "com.foo" %% "internal-library" % "1.0.0"

// 引入internal-library中的provided依赖,同时设置为当前项目的provided scope
libraryDependencies += "com.foo" %% "internal-library" % "1.0.0" % "provided" classifier "" configurations "provided"

原理说明

  • 第一行依赖用于引入internal-library的核心代码和非provided依赖;
  • 第二行指定从internal-library的provided配置中拉取依赖,并将这些依赖的scope设置为当前项目的provided,既无需重复声明Spark依赖,又能保证这些依赖不会被打包到胖JAR中。

可选优化:在internal-library中统一管理Spark依赖

如果需要更清晰的依赖划分,可以在internal-library中定义自定义配置聚合Spark依赖,避免与默认provided配置混淆:

修改internal-library的build.sbt:

// 定义自定义配置,专门用于聚合Spark相关依赖
val SparkProvided = config("sparkProvided").extend(Compile)

// 将Spark依赖放入自定义配置
libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "3.5.1" % SparkProvided.name,
  "org.apache.spark" %% "spark-sql" % "3.5.1" % SparkProvided.name
)

// 确保自定义配置的依赖能被下游项目识别
ivyConfigurations += SparkProvided

然后在abc项目中引入这个自定义配置的依赖:

libraryDependencies += "com.foo" %% "internal-library" % "1.0.0"
// 引入自定义配置的Spark依赖,并设置为provided
libraryDependencies += "com.foo" %% "internal-library" % "1.0.0" % "provided" classifier "" configurations "sparkProvided"

这种方式可以明确区分通用provided依赖和Spark专属依赖,便于后续维护。

内容的提问来源于stack exchange,提问作者ronnie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:33:12