【问题标题】:Create standalone jar using SBT使用 SBT 创建独立 jar
【发布时间】:2014-01-23 03:51:51
【问题描述】:

我是一个重度 Maven 用户,现在我在一些项目中逐渐使用 SBT。

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

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

【问题讨论】:

标签: sbt uberjar


【解决方案1】:

独立和使项目可用作依赖项或另一个项目之间存在差异。在第一种情况下,您将使用诸如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(组织)和工件-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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • JAR 文件在哪里结束?
    • 写入到 target/scala-2.xx/
    • 知道如何使用它创建一个可执行的 jar 文件吗?上次查看package命令创建的jar文件不可执行。
    • 我添加了使 jar 可执行所需的内容
    • 老话题,但我推荐这个插件用于 SBT - github.com/sbt/sbt-assembly 它非常好,我还建议你跟进 java 服务包装器 - wrapper.tanukisoftware.com/doc/english/integrate-jar-nix.html,你可以可靠地重启、运行、监控你的 jar可执行并将其集成到您的 CI 流程中。
    【解决方案3】:

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

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

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

    详情见article

    【讨论】:

    • 文章链接已失效。
    【解决方案4】:
    publishLocal
    

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

    publishM2
    

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

    【讨论】:

      【解决方案5】:

      我认为生成包含您的项目的独立 jar 的最简单方法, 可悲的是没有躺在 sbt 里面。

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

      感谢 Intellij,我可以轻松地选择我想在 jar 中包含或不包含哪个库(例如 scala stl)。

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

      如果你放置了 scala stl,你可以使用“java -jar”命令运行你的 jar,如果你没有,你必须在安装了正确版本的 scala 的地方运行它。

      【讨论】:

      • 这是一个选项,但是,大多数重要的项目都使用像 TeamCity 这样的持续集成工具来构建他们的产品,为此你需要像 SBT 这样的工具。
      • 同意。我的用例是一个小型实用程序,我想在不安装 scala 的情况下部署在远程机器上
      猜你喜欢
      • 2011-12-31
      • 1970-01-01
      • 2011-08-26
      • 2011-07-10
      • 2012-04-15
      • 2016-05-10
      • 2011-05-28
      • 2012-08-27
      • 1970-01-01
      相关资源
      最近更新 更多