我想在sbt
项目中添加一个Java库(例如Apache PDFBox)。
这是常春藤的依赖:
dependency org="org.apache.pdfbox" name="pdfbox" rev="1.8.2"
我首先尝试执行以下操作:
resolvers += "Sonatype releases" at "http://oss.sonatype.org/content/repositories/releases/"
libraryDependencies += "org.apache.pdfbox" %% "pdfbox" % "1.8.2"
但它给了我类型
的错误[warn] ==== public: tried [warn]
http://repo1.maven.org/maven2/org/apache/pdfbox/pdfbox_2.10/1.8.2/pdfbox_2.10-1.8.2.pom
所以我理解使用这种语法我可以管理Scala依赖项。我确信有一种方法可以管理Java依赖项,但是如何管理?
我尝试在Google中搜索“sbt add java dependencies”,但没有找到(识别)相关结果。
答案 0 :(得分:46)
您应该将%%
(双倍百分比)替换为单一。
libraryDependencies += "org.apache.pdfbox" % "pdfbox" % "1.8.2"
双百分比是一个便利运算符,并导致在路径中添加_
+ scalaVersion
后缀,在您的情况下为_2.10
。单一百分比应解决问题。
答案 1 :(得分:0)
简短答案:
使用
libraryDependencies += "org.apache.pdfbox" % "pdfbox" % "1.8.2"
对于Java库,
libraryDependencies += "org.scalactic" %% "scalactic" % "3.0.8"
对于Scala库,差异是scala库的两倍。
长答案:
Scala在主版本之间不向后兼容,因此为scala 2.12.x编译的库不能被用scala 2.13.x编写的项目使用。
因此,在编写Scala库时,您需要为每个要支持的Scala主要版本编译和发布一次。在项目中使用库时,您将必须选择为所使用的相同Scala主版本编译的版本。手动执行此操作很麻烦,因此SBT内置了对此功能的支持。
发布库时,您可以像
一样将crossScalaVersions键添加到SBT。crossScalaVersions := Seq( "2.10.6", "2.11.11", "2.12.3" )
然后使用sbt +publish
发布。这将使SBT为scala 2.10.6、2.11.11和2.12.3构建并发布该库的版本。请注意,在涉及库兼容性时,次要编号是无关的。已发布的库将带有后缀_2.10
,_2.11
和_2.12
的名称,以显示其适用的Scala版本。支持SBT构建的一种替代方法是使用实验性插件sbt-projectmatrix,因为它提供了更多选择,并且构建速度通常更快。
使用库时,sbt还可以帮助您使用为正确的scala版本编译的库,这就是%%发挥作用的地方。当指定名称中没有_后缀的库,而是使用%%时,sbt将填充与您使用的Scala主版本匹配的后缀,从而获取正确的库版本。