如何在SBT中定义另一个编译范围?

时间:2013-02-01 23:06:31

标签: sbt

默认情况下,SBT分别将src/mainsrc/tests下的来源编译为target/scala-[version]/classestarget/scala-[version]/test-classes。我想定义另一个名为 core 的组,我可以放入src/core/javasrc/core/scala并将其编译为单独的类路径。我该怎么做呢?

我的动机:我想拥有单独的类文件组,因为我想在开发期间重新编译和重新加载新的应用程序代码,而无需重新启动正在运行的应用程序的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 ?

我现在就开始阅读范围......

1 个答案:

答案 0 :(得分: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任务访问已编译的核心类路径。