【发布时间】:2014-02-13 04:04:42
【问题描述】:
默认情况下,我的 SBT 构建的运行任务会执行我在 src/main/scala/ 中(自动)找到的主类。
如何为行为与运行任务类似但在src/util/scala 中找到主类的项目添加新任务?该任务应该在类路径上运行带有src/main/scala 的util main 方法。
我正在使用具有完整多项目配置的 SBT 0.12.4。
【问题讨论】:
默认情况下,我的 SBT 构建的运行任务会执行我在 src/main/scala/ 中(自动)找到的主类。
如何为行为与运行任务类似但在src/util/scala 中找到主类的项目添加新任务?该任务应该在类路径上运行带有src/main/scala 的util main 方法。
我正在使用具有完整多项目配置的 SBT 0.12.4。
【问题讨论】:
以下定义了一个新配置,它从src/util/scala 编译源代码,并定义util:run 和util:run-main 以从新配置运行主类。编译和运行时,来自src/main/scala 的编译源在类路径中可用。
import sbt._
import Keys._
object MyBuild extends Build
{
// Define a new configuration named `util`.
// Extending `Compile` means the main classpath is available to `util`
lazy val Util = config("util").extend(Compile)
// Add the new configuration to the project.
// Add the new settings.
lazy val root = Project("root", file(".")).configs(Util).settings( utilSettings : _*)
// Add the basic source, compilation, and packaging settings
// as well as custom run methods.
lazy val utilSettings = inConfig(Util)( Defaults.configSettings ++ utilRunSettings )
// Settings that define `run` and `run-main` to use the
// classpath from the enclosing configuration.
// (The standard `run` methods use the `Runtime` configuration.
lazy val utilRunSettings = Seq(
run <<= Defaults.runTask(fullClasspath, mainClass in run, runner in run),
runMain <<= Defaults.runMainTask(fullClasspath, runner in run)
)
}
(在 0.13 上测试过,但应该可以在 0.12 上使用。)
【讨论】:
util:run 自动从src/main/scala 找到并运行主类。
util:run 仅在src/util/scala 中运行主类。也许您可以验证 sn-p 在独立项目中的工作原理,然后发布您如何将其集成到您的构建中?
我不认为 sbt 会找到你放在 src/util/... 中的代码,它应该放在 src/main/scala、src/test/scala 等中。你可能想要将实用程序类添加到一些一种“util”包,可能在 src/main/com/example/util 中,或者将它们放在子项目或依赖项目中,但 sbt 并没有真正设计(afaik)能够处理任意目录结构。
至于设置多个main方法,sbt run,如果在src/main/scala中找到多个main方法,会让你选择调用哪一个。
如果它在外部 jar 中,您可能需要:Configuring sbt project to include external Main methods in "sbt run"
我通常做的是运行sbt console,然后直接从那里导入并调用 main 方法。例如:
sbt console
import com.example.Main
Main(new String[])
由于您有子项目,如果您的项目之一是“util”,您应该能够使用sbt util/run 之类的东西在 util/src/main/scala 中运行 main 方法。
如果您在一个项目中有多个主要方法,您也应该能够使用sbt "util/run-main com.example.MainClass"。
您也可以考虑使用 sbt start-script 插件: https://github.com/sbt/sbt-start-script
【讨论】:
main 和util 目录,并使用不同名称的“运行”任务。我只是不知道该怎么做。
src/main/scala 中有一个主类以及我的大部分业务逻辑,在src/main/util 中有一些实用程序代码。实用程序代码与主代码非常相关,因此它似乎不保证它自己的子项目。实用程序代码有自己的主类,而不是测试用例代码,它挂在通常的src/test/scala。