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
相关产品推荐
相关产品推荐

