如何通过SBT为Scala项目添加MATSim依赖并解决相关报错
问题解答
疑问1:为什么需要手动添加jogl-all和gluegen-rt依赖?
- MATSim官方依赖的jogl-all和gluegen-rt是定制修改的fork版本,版本号为
2.4.0-matsim-1,没有上传到Maven中央仓库,仅在MATSim私有仓库托管 - MATSim的POM文件中对这两个依赖的原生构件配置了多平台classifier,SBT默认的传递依赖解析逻辑和Maven存在差异,无法自动识别并拉取定制版本的依赖,会优先从公共仓库拉取标准版本,和MATSim的版本要求不兼容,所以需要手动声明指定版本。
- 你当前手动声明的
gluegen-rt版本为2.3.2,和MATSim要求的2.4.0-matsim-1版本冲突,进一步导致依赖解析异常。
疑问2:为什么依赖拉取报错?
你遇到的报错核心原因有两个:
- MATSim仓库仅托管了Windows、Linux、MacOS三大常用桌面平台的jogl原生构件,报错中提到的solaris、android等冷门平台的原生包根本没有上传到仓库,而SBT默认会拉取构件所有平台的原生依赖,自然会出现404找不到的错误。
- 你添加的
org.matsim.contrib:vsp依赖本身传递依赖了2.4.0-matsim-1版本的gluegen-rt,和你手动声明的2.3.2版本出现冲突,依赖仲裁后强制拉取2.4.0版本的所有相关构件,放大了原生包找不到的问题。
修复方案
修改你的build.sbt配置如下即可解决问题:
name := "matsim-console" version := "0.1" scalaVersion := "2.13.7" lazy val matsimVersion = "13.0" // 仅保留有用的仓库,无效的bintray、mvnrepository代理配置可以删除 resolvers ++= Seq( "osgeo" at "https://repo.osgeo.org/repository/release/", "matsim" at "https://repo.matsim.org/repository/matsim" ) // 配置仅拉取主流桌面平台的原生依赖,避免拉取不存在的冷门平台构件 javaOptions += "-Dcoursier.native.classifiers=linux-x86_64,windows-x86_64,macosx-x86_64,macosx-arm64" lazy val proj = (project in file(".")) .settings( // 手动添加统一版本的jogl相关依赖 libraryDependencies += "org.jogamp.jogl" % "jogl-all" % "2.4.0-matsim-1", libraryDependencies += "org.jogamp.gluegen" % "gluegen-rt" % "2.4.0-matsim-1", // 添加matsim和vsp依赖,排除传递的jogl相关依赖避免版本冲突 libraryDependencies += "org.matsim" % "matsim" % matsimVersion exclude("org.jogamp.jogl", "jogl-all") exclude("org.jogamp.gluegen", "gluegen-rt"), libraryDependencies += "org.matsim.contrib" % "vsp" % matsimVersion exclude("org.jogamp.jogl", "jogl-all") exclude("org.jogamp.gluegen", "gluegen-rt"), )
内容的提问来源于stack exchange,提问作者SheperoMah
相关产品推荐
相关产品推荐

