SBT依赖无法从Git仓库解析问题及最优方案咨询
问题原因分析
首先,你遇到的依赖未解析错误,核心原因是**ProjectRef的第二个参数填错了**。
ProjectRef的第二个参数需要的是目标仓库里具体项目的模块ID,而不是仓库的名称。咱们看你引用的两个仓库:
datapackage-java仓库里的项目ID其实是datapackage(查看它的build.sbt,里面定义的是lazy val datapackage = (project in file("."))...)tableschema-java仓库里的项目ID是tableschema
你之前填的是仓库名datapackage-java和tableschema-java,SBT找不到对应模块,自然会抛出“not found”的错误。
最优解决方案
根据你的需求(不想打包Jar、直接依赖GitHub上的SBT项目),这里提供两种靠谱的方式:
方式一:修正ProjectRef的参数
直接把ProjectRef的第二个参数改成正确的模块ID就行,修改后的build.sbt配置如下:
// 修正模块ID为仓库内的项目ID lazy val datapackage = ProjectRef(uri("https://github.com/frictionlessdata/datapackage-java.git"), "datapackage") lazy val tableschema = ProjectRef(uri("https://github.com/frictionlessdata/tableschema-java.git"), "tableschema") lazy val root = (project in file(".")).enablePlugins(PlayJava) .dependsOn(datapackage) .dependsOn(tableschema) // 其他常规依赖 libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.6" // ...
这样SBT就能正确识别并拉取对应模块的代码了。
方式二:使用sbt-git-dependencies插件(更简洁)
如果觉得ProjectRef写起来麻烦,可以用专门的Git依赖插件,它能让你像写常规依赖一样引用GitHub上的SBT项目:
- 先在
project/plugins.sbt里添加插件:
addSbtPlugin("com.codecommit" % "sbt-git-dependencies" % "1.0.2") // 建议使用最新版本
- 然后在
build.sbt里直接添加依赖:
lazy val root = (project in file(".")).enablePlugins(PlayJava) .settings( libraryDependencies ++= Seq( "org.apache.commons" % "commons-lang3" % "3.6", // 引用GitHub上的项目,版本号对应仓库里的定义 "io.frictionlessdata" %% "datapackage" % "0.1-SNAPSHOT" from git("https://github.com/frictionlessdata/datapackage-java.git"), "io.frictionlessdata" %% "tableschema" % "0.1-SNAPSHOT" from git("https://github.com/frictionlessdata/tableschema-java.git") ) )
这种方式更接近你平时用的libraryDependencies写法,维护起来更顺手。
补充说明
为什么之前常规的libraryDependencies能成功?因为那些依赖是发布到Maven/SBT公共仓库的,SBT可以直接从仓库拉取Jar包;而你现在引用的项目没上传到公共仓库,所以需要用Git相关的依赖方式来直接拉取源码构建。
内容的提问来源于stack exchange,提问作者max152
相关产品推荐
相关产品推荐

