我曾是 Maven 的重度用户,现在逐渐将其应用于我的一些项目中。
我想知道如何使用 SBT 创建一个独立的 Java 项目?这个项目应该被打包成一个 JAR 文件,并且这个 JAR 文件将被用作另一个 SBT 项目的依赖。
在 Maven 中,我可以在我的 pom.xml
中告诉它在构建时应该生成什么类型的 artifact。在 SBT 中是否有类似的功能?
我曾是 Maven 的重度用户,现在逐渐将其应用于我的一些项目中。
我想知道如何使用 SBT 创建一个独立的 Java 项目?这个项目应该被打包成一个 JAR 文件,并且这个 JAR 文件将被用作另一个 SBT 项目的依赖。
在 Maven 中,我可以在我的 pom.xml
中告诉它在构建时应该生成什么类型的 artifact。在 SBT 中是否有类似的功能?
独立运行和将项目作为依赖项或另一个项目使用有所不同。在第一种情况下,您可以使用像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"
(在group ID和artifact ID之间仅使用一个%
字符)。
更多发布信息请参见sbt文档。
'sbt package'将生成一个jar文件。
如果您想要使其可执行,则需要将以下内容添加到您的.sbt配置文件中:
'mainClass in Compile := Some("your.main.Class")
publishLocal
publishM2
与上述相同,不同之处在于构件发布到本地Maven仓库而不是Ivy仓库。
我认为最简单的方法是使用IDE(如Intellij)生成包含项目的独立jar文件,而不是使用sbt。
我个人使用Intellij的“构建工件”功能来制作jar文件。通过Intellij,我可以轻松选择要包含在jar文件中的库(例如scala stl)。
在我看来,这是获得可执行jar文件的最简单方法。
如果你将scala stl放入jar文件中,你可以使用“java -jar”命令运行它;否则,你需要在安装了正确版本的scala的某个地方运行它。