我是一个沉重的Maven用户,现在我逐渐将SBT用于我的一些项目。
我想知道如何使用SBT创建独立的Java项目?此项目应打包为JAR文件,此JAR文件将用作另一个SBT项目中的依赖项。
在Maven中,我可以在pom.xml
中告诉我构建它时应该生成什么类型的工件。在SBT中我能做些类似的东西吗?
答案 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来运行它。