如何向sbt项目添加本地库依赖?

28

我想向一个 sbt 项目添加一个 Java 库(例如 Apache PDFBox)。

这是 Ivy 依赖项:

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”,但没有找到相关结果。

2个回答

54

你应该用单个百分号替换掉双百分号%%

libraryDependencies += "org.apache.pdfbox" % "pdfbox" % "1.8.2"
双百分号是一个方便的操作符,会在路径内添加_+scalaVersion后缀,对于您的情况是_2.10。使用单个百分号应该可以解决这个问题。

4
4行回答还需要TL;DR吗? - kiritsuku

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主要版本匹配的后缀,从而获取正确版本的库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接