我的项目依赖于外部jar。我创建了一个目录lib
并将jar文件复制到其中。这是我的build.sbt
:
name := "approxstrmatch"
version := "1.0"
scalaVersion := "2.10.4"
unmanagedJars in Compile += file("lib/secondstring-20140729.jar")
libraryDependencies+="org.apache.spark"%%"spark-core"%"1.0.0"
resolvers += "AkkaRepository" at "http://repo.akka.io/releases/"
当我运行clean
和package
时,外部jar文件不会包含在生成的jar文件中。为什么呢?
这是项目布局:
project/build.sbt
lib/
src/.....
答案 0 :(得分:30)
试试这个
libraryDependencies += "com.acme.common" % "commonclass" % "1.0" from "file:///Users/bwong/git/perf-tools/commonclass/target/scala-2.11/commonclass_2.11-1.0.jar"
我" sbt package"公共classproject然后只在依赖项目中的build.sbt中添加该库依赖项。
感谢http://flummox-engineering.blogspot.com/2014/06/sbt-use-jar-file-for-librarydependencies.html这个黑客攻击。
答案 1 :(得分:29)
首先,除非您有更复杂的配置,否则无需明确指定unmanagedJars
。只需将您的JAR文件放入lib
目录,它们就会被添加到类路径(docs)。
要打包具有所有必需依赖项的可执行JAR,请使用其中一个SBT插件:sbt-onejar或sbt-assembly。 package
只是将您的类打包到一个jar中,并且不会为包含依赖项而烦恼。
插件文档中的说明应该很容易指导您如何使用它们。
答案 2 :(得分:17)
诀窍是确定将JAR放入哪个lib
目录。您可以通过在sbt控制台中运行以下命令来完成此操作:show unmanagedBase
。
如果您没有在那里看到您的项目,可以运行show YOURPROJECT/unmanagedBase
来找到正确的lib
路径。
答案 3 :(得分:3)
添加此行您的build.sbt和清洁&编译你的项目。
project / libs,其中project是项目的根目录,将你的jar放在libs文件夹中。
unmanagedBase <<= baseDirectory { base => base / "libs" }
答案 4 :(得分:1)
tl; dr 将project/build.sbt
移至lib
目录所在的一级,然后使用sbt-assembly插件(如the other answer by Aleksey中所述)。< / p>
如果项目目录布局与您用于项目的布局一样,那么它是不正确的,因为build.sbt
不属于lib
所在的同一版本。
由于sbt is recursive此project/build.sbt
描述了管理主要项目的项目构建。引用the docs:
项目目录是项目中的另一个项目 知道如何建立你的项目。项目内部的项目可以(在 理论)做任何其他项目可以做的事情。您的构建定义是 一个sbt项目。
海龟一路走下去。如果你愿意,你可以调整一下 通过创建一个构建定义项目的构建定义 项目/项目/目录。
答案 5 :(得分:1)
我正在用解析器和settingKey vars绞尽脑汁,但这似乎是最简单的方法(https://www.scala-sbt.org/release/docs/Library-Dependencies.html):
resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
然后像往常一样将其添加到libraryDependencies
libraryDependencies += "<group>" % "<artifact>" % "<version>"
答案 6 :(得分:0)
其中一个解决方案是,当您在sbt中构建该jar时,请执行sbt publish-local