为项目定制“运行”任务

时间:2014-01-22 21:12:10

标签: scala build sbt

默认情况下,我的SBT构建的运行任务执行src/main/scala/中找到的(自动)主类。

如何为项目添加新任务,其行为与运行任务类似但在src/util/scala中找到主类?该任务应该在类路径上使用src/main/scala运行util main方法。

我正在使用SBT 0.12.4和完整的多项目配置。

2 个答案:

答案 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:runutil: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上测试。)