使用SBT创建独立jar

时间:2014-01-05 19:36:13

标签: sbt uberjar

我是一个沉重的Maven用户,现在我逐渐将SBT用于我的一些项目。

我想知道如何使用SBT创建独立的Java项目?此项目应打包为JAR文件,此JAR文件将用作另一个SBT项目中的依赖项。

在Maven中,我可以在pom.xml中告诉我构建它时应该生成什么类型​​的工件。在SBT中我能做些类似的东西吗?

5 个答案:

答案 0 :(得分:74)

独立和使项目可用作依赖项或其他项目之间存在差异。在第一种情况下,您将使用诸如sbt-assembly之类的插件。它将做的是创建一个 jar文件,其中包含项目类文件及其所有依赖项。如果你编写一个应用程序,你得到的是一个可以在任何地方执行的双击jar。

如果要将项目A用作另一个项目B的依赖项,则可以使用不同的选项。您可以使用sbt package(@Channing Walton的回答)打包A的类文件。然后,您可以将生成的.jar文件放在项目B的lib目录中。但是,如果A还需要库,则必须确保它们最终也会出现在项目B的库中。

更好的方法是发布您的项目。您可以使用sbt publish-local在本地计算机上完全执行此操作。这将把package生成的jar存储在一个特殊的本地目录中,该目录可以从另一个项目中的sbt访问,还有一个包含A依赖项的POM文件。它将使用一个组ID(组织)和artifact-ID(名称)以及项目的版本A.例如,在build.sbt

name              := "projecta"

version           := "0.1.0-SNAPSHOT"

organization      := "com.github.myname"

scalaVersion      := "2.10.3"

publishMavenStyle := true

使用sbt publish-local发布后,您可以将以下依赖项添加到项目B:

libraryDependencies += "com.github.myname" %% "projecta" % "0.1.0-SNAPSHOT"

如果您有纯Java项目,则可以省略Scala版本后缀,即在项目A中:

crossPaths       := false

autoScalaLibrary := false

然后在项目B中:

libraryDependencies += "com.github.myname" % "projecta" % "0.1.0-SNAPSHOT"

(在组和工件ID之间仅使用一个%个字符。)

有关在sbt documentation发布的详情。

答案 1 :(得分:30)

'sbt package'将生成一个jar文件。

如果您希望它可执行,您需要将以下内容添加到.sbt配置中:

mainClass in Compile := Some("your.main.Class")

答案 2 :(得分:7)

当然,你可以使用'sbt package'命令,它会创建一个jar文件,但是这个jar将没有任何依赖。要运行它,必须为库指定'classpath'arg。

在您的情况下,您希望有一个独立的可运行文件。您需要添加依赖项。 为此,您可以为SBT使用“assembly”插件,请参阅https://github.com/sbt/sbt-assembly/

之后你可以运行'sbt assembly'命令,它提供了一个胖jar文件,其中包含你可以随时随地部署和运行的所有依赖项。

有关详细信息,请参阅此article

答案 3 :(得分:4)

publishLocal

构建工件并在本地Ivy存储库中发布,使其可用于本地项目依赖项。

publishM2

与上述相同,但工件发布在本地Maven仓库而非Ivy仓库。

答案 4 :(得分:2)

我认为用你的项目制作独立jar的最简单方法是, 可悲的是没有躺在里面。

我个人使用我的IDE:Intellij制作jar(通过'构建工件'功能)。

感谢Intellij,我可以轻松选择我想要包含在jar中的库(例如scala stl)。

恕我直言,这是迄今为止为项目获取可执行jar的最简单方法。

如果你把scala stl你可以使用" java -jar"运行你的jar。命令,如果你不必在某个地方使用" scala"安装正确版本的scala来运行它。