2013-08-19 21 views
4

我正在編寫一個依賴代碼的庫(我們稱之爲foo.jar),該庫僅作爲二進制jar提供。按照標準,我將這個放在lib/目錄中,以便SBT將它視爲非託管依賴項。迄今爲止這很好。使用SBT處理庫中的非託管類路徑JAR,以便依賴項目可以訪問它們

但是,由於這是一個庫,我希望能夠發佈它,以便依賴它的其他項目也可以訪問foo.jar中的非託管代碼,而無需手動找到它。我原本以爲我可以使用一個胖罐子插件(如SBT Assembly)創建一個具有依賴關係的罐子,但這並不影響使用sbt publish-local實際發佈的內容 - 它只在運行sbt assembly時創建一個胖罐子。有一些標準的簡單方法來處理這個問題嗎?對於每個使用非託管依賴項的庫在下游使用其他項目時破壞它似乎是個壞主意,所以我想知道我是否錯過了一些明顯的東西。

回答

3

我不知道這是一個良好的使用SBT組裝的,因爲其他庫可能取決於不同版本的foo.jar等來解決它

一種方法是在Maven倉庫發佈foo.jar你自己。斯卡拉和/或社區中的一些人一直在談論bintray。它仍處於測試階段,但如果您希望發佈一些jar文件,它看起來很有希望。

+1

我常常覺得不舒服把代碼我不知道(並且不能)保持在公共存儲庫上。我要麼必須將該組織列爲我的組織,這隱含地說我要爲它承擔責任,或者作爲他們的組織,這意味着他們的軟件包沒有在那裏(以該形式)在網上。乍一看,Bintray解決了這個所有權問題。我一定會看看。 (我沒有想過版本控制問題 - 我想這就是爲什麼一般難以解決的原因) –

+0

你可以嘗試推動foo.jar的作者發佈。 –

+0

3.5年,我遇到了這個問題。 Bintray最終成爲解決這個問題的首選方法嗎? – Synesso

1

您可以通過操縱mappings in (Compile, packageBin)來包含想要打包的罐子的文件(publish使用packageBin的輸出)來獲得所需的結果。這項技術將允許您在jar中包含絕對的任何文件。官方sbt文檔位於:http://www.scala-sbt.org/0.12.3/docs/Howto/package.html#contents

作爲示例,請考慮在您的jar中包含.properties文件的常見情況。假設你需要在打包的jar包的路徑「com/bigco/messages.properties」下包含「messages.properties」。而且可以說,這個文件是在src /主/斯卡拉/ ...你可以添加以下到您的build.sbt:

mappings in (Compile, packageBin) <+= baseDirectory map { base => 
    (base/"src"/"main"/"scala"/"com"/"bigco"/"messages.properties") -> "com/bigco/messages.properties" 
} 

要試圖回答你原來的問題,你可以解壓foo.jar並添加每個根據其正確的程序包路徑,將class文件中的一個裝入打包的jar文件中。如此的相似,

mappings in (Compile, packageBin) <+= baseDirectory map { base => 
    (base/path/to/unzipped/file.class) -> "path.to.unzipped.file.class" 
    ... 
} 

或者一些你也許能逃脫簡直包括foo.jar在包裝罐子像這樣的根:

mappings in (Compile, packageBin) <+= baseDirectory map { base => 
    (base/"lib"/"foo.jar") -> "foo.jar" 
} 
相關問題