2013-02-01 18 views
5

默認情況下,SBT分別編譯源src/mainsrc/teststarget/scala-[version]/classestarget/scala-[version]/test-classes。我想定義另一個名爲的核心組,我可以將它放在src/core/javasrc/core/scala中,並將其編譯爲單獨的類路徑。我該怎麼做呢?如何在SBT中定義另一個編譯範圍?

我的動機:我希望有單獨的類文件組,因爲我想在開發過程中重新編譯和重新加載新的應用程序代碼,而無需重新啓動正在運行的應用程序的JVM進程。因此,核心類將在應用程序啓動時加載,並且它們將使用自定義類加載器從src/main加載其他所有內容。後面的類將可以重新加載。我需要這樣做,因爲我正在編寫一個音樂程序,通過JNI加載軟件樂器,這需要很長時間才能加載。在開發過程中重新啓動應用程序會浪費太多時間。

我主要需要分開類文件。如果我生產罐子,我想要myapp-core.jar和myapp-main.jar,但這並不重要,因爲這對於開發而言不僅僅是最終產品。

第一次嘗試:

val Core = config("core") 
... 
classDirectory in Core <<= crossTarget(t => file(t.getAbsolutePath + "core-classes")) 

給出了這樣的錯誤:

Reference to undefined setting: 
{.}/*:cross-target from {.}/core:class-directory 
    Did you mean *:cross-target ? 

我會去了解現在範圍...

回答

5

還有就是SBT文檔中的advanced configurations example那顯示了自定義編譯配置的許多方面。

一個基本的例子是:

object MyBuild extends Build { 

    lazy val root = Project(..., 
    settings = Defaults.defaultSettings ++ coreSettings 
) 

    // Declare the custom configuration. 
    lazy val Core = config("core") 

    lazy val coreSettings: Seq[Setting[_]] = 
    // Add the src/core/scala/ compilation configuration. 
    // This configures sources, classpaths, output directories, REPL, scalac, ... 
    inConfig(Core)(Defaults.configSettings) ++ Seq(
     // example dependency just for Core 
     libraryDependencies += "org.example" % "demo" % "1.0" % Core, 
     // register the custom core configuration 
     ivyConfigurations += Core 
    ) 
} 

訪問通過fullClasspath in Core任務編譯核心類路徑。

+0

如果這個例子比您需要或理解的更多,那麼您希望使用哪種附加配置?發佈它,將它包含在主jar中,...? –

+0

我還不明白這個例子。我已經添加了這個問題來解釋我想要的附加配置。 –

+0

這很好用,但是如何使Core配置可用於測試配置? – Brendanator

相關問題