如何将包含外部jar文件包含到jar中?

时间:2014-08-04 23:49:04

标签: sbt

我的项目依赖于外部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/"

当我运行cleanpackage时,外部jar文件不会包含在生成的jar文件中。为什么呢?

这是项目布局:

project/build.sbt
lib/
src/.....

7 个答案:

答案 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-onejarsbt-assemblypackage只是将您的类打包到一个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 recursiveproject/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