使用SBT创建独立jar

spa*_*rkr 48 uberjar sbt

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

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

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

0__*_*0__ 74

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

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

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

name              := "projecta"

version           := "0.1.0-SNAPSHOT"

organization      := "com.github.myname"

scalaVersion      := "2.10.3"

publishMavenStyle := true
Run Code Online (Sandbox Code Playgroud)

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

libraryDependencies += "com.github.myname" %% "projecta" % "0.1.0-SNAPSHOT"
Run Code Online (Sandbox Code Playgroud)

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

crossPaths       := false

autoScalaLibrary := false
Run Code Online (Sandbox Code Playgroud)

然后在项目B中:

libraryDependencies += "com.github.myname" % "projecta" % "0.1.0-SNAPSHOT"
Run Code Online (Sandbox Code Playgroud)

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

更多关于在sbt文档中发布的内容.


Cha*_*ton 30

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

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

mainClass in Compile := Some("your.main.Class")
Run Code Online (Sandbox Code Playgroud)

  • 它写入目标/ scala-2.xx / (4认同)
  • JAR 文件最终存放在哪里? (2认同)
  • 老话题,但我推荐这个插件用于 SBT - https://github.com/sbt/sbt-assembly 它非常好,我还建议你跟进 java 服务包装器 - http://wrapper.tanukisoftware.com/doc/ english/integrate-jar-nix.html,您可以可靠地重新启动、运行、监控您的 jar 可执行文件并将其集成到您的 CI 过程中。 (2认同)

max*_*hov 7

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

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

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

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

  • 文章链接已失效。 (2认同)

Mar*_*rco 5

publishLocal
Run Code Online (Sandbox Code Playgroud)

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

publishM2
Run Code Online (Sandbox Code Playgroud)

与上面相同,但工件发布在本地 Maven 存储库而不是 Ivy 存储库中。