默认情况下,SBT下编译源src/main和src/tests以target/scala-[version]/classes和target/scala-[version]/test-classes分别.我想定义另一个名为core的组,我可以将其放入src/core/java或者src/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"))
Run Code Online (Sandbox Code Playgroud)
给出了这个错误:
Reference to undefined setting:
{.}/*:cross-target from {.}/core:class-directory
Did you mean *:cross-target ?
Run Code Online (Sandbox Code Playgroud)
我现在就去看看范围...
sbt文档中有一个高级配置示例,它显示了自定义编译配置的许多方面.
一个基本的例子是:
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
)
}
Run Code Online (Sandbox Code Playgroud)
通过fullClasspath in Core任务访问已编译的核心类路径.
| 归档时间: |
|
| 查看次数: |
1387 次 |
| 最近记录: |