使用SBT创build独立的jar

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

我想知道如何使用SBT创build一个独立的Java项目? 这个项目应该打包成一个JAR文件,这个JAR文件将被用作另一个SBT项目的依赖项。

在Maven中,我可以在我的pom.xml告诉我在构build它时应该生成哪种types的工件。 SBT有类似的东西吗?

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

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

更好的方法是发布你的项目。 您可以使用sbt publish-local纯粹在本地计算机上执行此操作。 这将把jar文件存储在一个特殊的本地目录中,这个目录可以从另一个项目的sbt中访问,同时还有一个包含了A的依赖关系的POM文件。它将使用一个group-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文档中发布。

'sbt package'会产生一个jar文件。

如果你希望它是可执行的,你需要添加以下到您的.sbtconfiguration:

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

当然,你可以使用'sbt package'命令,它会创build一个jar文件,但是这个jar没有任何依赖关系。 运行它需要指定“classpath”arg到库。

在你的情况下,你希望一个独立的可运行文件。 你需要添加依赖关系。 要做到这一点,你可以使用'assembly'插件SBT,请参阅https://github.com/sbt/sbt-assembly/

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

详情请参阅这篇文章

 publishLocal 

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

 publishM2 

和上面一样,但是神器出现在当地的Maven回购中,而不是常春藤回购。

我认为最简单的方法来生产一个独立的jar子,其中的项目,可悲的是不躺在里面。

我个人使用我的IDE:Intellij来制作jar(通过“build artifact”function)。

感谢Intellij,我可以很容易地select我要包含在jar中的库(例如scala stl)。

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

如果你使用scala stl,你可以使用“java -jar”命令来运行你的jar,如果你没有在scala中安装正确版本的scala的话。