我是一个重度 Maven 用户,现在我逐渐将 SBT 用于我的一些项目。
我想知道如何使用 SBT 创建一个独立的 Java 项目?这个项目应该被打包为一个 JAR 文件,这个 JAR 文件将被用作另一个 SBT 项目中的依赖项。
在 Maven 中,我可以在pom.xml
构建它时告诉我它应该生成什么类型的工件。我可以在 SBT 中做类似的事情吗?
独立和使项目可用作依赖项或另一个项目之间是有区别的。在第一种情况下,您将使用诸如sbt-assembly 之类的插件。它将创建一个包含项目类文件及其所有依赖项的 jar 文件。如果您编写一个应用程序,您会得到一个可双击的 jar,您可以在任何地方执行它。
如果您想使用您的项目 A 作为另一个项目 B 的依赖项,您有不同的选择。您可以使用sbt package
(@Channing Walton 的答案)打包 A 的类文件。然后您可以将生成的.jar
文件放到lib
项目 B 的目录中。但是,如果 A 还需要库,则必须确保它们也最终出现在项目 B 的库中。
更好的方法是发布您的项目。您可以在本地机器上使用sbt publish-local
. 这会将生成的 jar 存储package
在一个特殊的本地目录中,该目录可以从另一个项目中的 sbt 访问,以及一个包含 A 的依赖项的 POM 文件。它将使用组 ID(组织)和工件 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 文件。
如果您希望它是可执行的,您需要将以下内容添加到您的 .sbt 配置中:
mainClass in Compile := Some("your.main.Class")
当然,您可以使用“sbt package”命令,它会创建一个 jar 文件,但这个 jar 将没有任何依赖关系。要运行它,必须为库指定“类路径”参数。
在您的情况下,您希望有一个独立的可运行文件。您需要添加依赖项。为此,您可以使用 SBT 的“程序集”插件,请参阅https://github.com/sbt/sbt-assembly/
之后你可以运行“sbt assembly”命令,它提供了一个包含所有依赖项的胖 jar 文件,你可以随时随地部署和运行。
详情请看这篇文章
publishLocal
构建工件并在本地 Ivy 存储库中发布,使其可用于您的本地项目依赖项。
publishM2
与上面相同,但工件发布在本地 Maven 存储库而不是 Ivy 存储库中。
我认为生成一个包含项目的独立 jar 的最简单方法是遗憾地不在 sbt 中。
我个人使用我的 IDE:Intellij 来制作 jar(通过“构建工件”功能)。
多亏了 Intellij,我可以轻松地选择要在 jar 中包含或不包含的库(例如 scala stl)。
恕我直言,这是迄今为止为您的项目获取可执行 jar 的最简单方法。
如果你放了 scala stl,你可以使用“java -jar”命令运行你的 jar,如果你不需要,你必须在安装了正确版本的 scala 的地方运行它。