默认情况下,我的SBT构建的运行任务执行src/main/scala/
中找到的(自动)主类。
如何为项目添加新任务,其行为与运行任务类似但在src/util/scala
中找到主类?该任务应该在类路径上使用src/main/scala
运行util main方法。
我正在使用SBT 0.12.4和完整的多项目配置。
答案 0 :(得分:1)
我不认为sbt会找到你放在src / util /中的代码......它应该放在src / main / scala,src / test / scala等中。你可能想要为某些人添加实用程序类一种“util”包,可能在src / main / com / example / util中,或者将它们放在子项目或依赖项目中,但sbt并没有真正设计(afaik)能够处理任意目录结构。 / p>
至于设置多个主要方法,sbt run,如果在src / main / scala中找到多个主要方法,将允许你选择要调用的方法。
如果它在外部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
答案 1 :(得分:1)
以下定义了一个新配置,该配置编译来自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上测试。)