2014-01-05 60 views
44

我是一個沉重的Maven用戶,現在我正在逐步使用SBT來處理我的一些項目。使用SBT創建獨立的罐子

我想知道如何使用SBT創建獨立的Java項目?這個項目應該打包成一個JAR文件,這個JAR文件將被用作另一個SBT項目的依賴項。

在Maven中,我可以告訴我的pom.xml當我構建它時應該產生什麼類型的工件。 SBT中可以做些類似的事情嗎?

+4

看看SBT-onejar:https://github.com/sbt/sbt-onejar。另請參見[聚合和類路徑依賴項](http://www.scala-sbt.org/release/docs/Getting-Started/Multi-Project.html) – FoggyDay

+0

如何使用sbt-onejar創建新的sbt項目?例如,在Maven中,有一個命令行可以爲我生成項目結構。關於如何用sbt和sbt-onejar做到這一點的任何想法? – sparkr

+0

如果你有很多的依賴關係,你也可以使用https://github.com/sbt/sbt-assembly 在做一些指令之後調用'sbt assembly'就像我一樣。 – DaunnC

回答

68

有獨立,使一個項目可用作一個依賴或其他項目之間的差異。在第一種情況下,您可以使用插件,如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

30

'sbt package'會產生一個jar文件。

如果你希望它是可執行的,你需要以下內容添加到您的名.bst配置:

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

JAR文件在哪裏結束? –

+4

其寫入目標/ scala-2.xx/ –

+1

任何想法如何使用它創建一個可執行的jar文件?上次我檢查由package命令創建的jar文件是不可執行的。 –

4
publishLocal 

構建工件並在本地Ivy存儲庫中發佈,使其可用於本地項目依賴項。

publishM2 

與上面相同,但是該工件在本地Maven回購站中發佈,而不是常春藤回購。

2

我認爲最簡單的方法來生產一個獨立的罐子,其中的項目, 可悲的是不躺在sbt內。

我個人使用我的IDE:Intellij來製作jar(通過'build artifact'功能)。

感謝Intellij,我可以很容易地選擇我想在jar中包含哪個庫(例如scala stl)。

恕我直言,這是迄今爲止最簡單的方法來獲得您的項目的可執行jar。

如果你放置scala stl,你可以使用「java -jar」命令運行你的jar,如果你不需要在scala中安裝正確版本的scala來運行它。

+1

然而,這是一個選項,大多數重要的項目都是通過像TeamCity這樣的持續集成工具來構建它們的工件,爲此您需要像SBT這樣的工具。 –

+0

同意。我的用例是一個小工具,我想在不安裝scala的情況下部署在遠程機器上。 – gwenzek

7

當然,你可以使用'sbt package'命令,它會創建一個jar文件,但是這個jar沒有任何依賴關係。運行它需要爲庫指定'classpath'arg。

在你的情況下,你希望一個獨立的可運行文件。你需要添加依賴關係。 要做到這一點,你可以使用SBT「裝配」插件,請參考https://github.com/sbt/sbt-assembly/

之後,你可以運行「SBT集」命令,它提供了所有的依賴脂肪的jar文件,您可以部署和任何地方和任何運行時間。

有關詳情請參閱本article

+0

文章鏈接已經死機。 – Thilo