From 7a1a21d8c8dcec1273d84150aef7d13a35d49db3 Mon Sep 17 00:00:00 2001 From: Tomasz Bartczak Date: Mon, 13 Oct 2014 22:19:21 +0200 Subject: [PATCH] Fix for sbt#1648 - warn when no or multiple main classes --- main/src/main/scala/sbt/Defaults.scala | 20 ++++++++++++++++---- notes/0.13.7.markdown | 3 +++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 83b8285a7..6639955fe 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -264,9 +264,9 @@ object Defaults extends BuildCommon { definedSbtPlugins <<= discoverPlugins, discoveredSbtPlugins <<= discoverSbtPluginNames, inTask(run)(runnerTask :: Nil).head, - selectMainClass := mainClass.value orElse selectRunMain(discoveredMainClasses.value), + selectMainClass := pickMainClass(discoveredMainClasses.value) orElse askForMainClass(discoveredMainClasses.value), mainClass in run := (selectMainClass in run).value, - mainClass := selectPackageMain(discoveredMainClasses.value), + mainClass := pickMainClassOrWarn(discoveredMainClasses.value, streams.value.log), run <<= runTask(fullClasspath, mainClass in run, runner in run), runMain <<= runMainTask(fullClasspath, runner in run), copyResources <<= copyResourcesTask @@ -662,10 +662,22 @@ object Defaults extends BuildCommon { new Package.Configuration(srcs, path, options) } - def selectRunMain(classes: Seq[String]): Option[String] = + @deprecated("use Defaults.askForMainClass", "0.13.7") + def selectRunMain(classes: Seq[String]): Option[String] = askForMainClass(classes) + @deprecated("use Defaults.pickMainClass", "0.13.7") + def selectPackageMain(classes: Seq[String]): Option[String] = pickMainClass(classes) + def askForMainClass(classes: Seq[String]): Option[String] = sbt.SelectMainClass(Some(SimpleReader readLine _), classes) - def selectPackageMain(classes: Seq[String]): Option[String] = + def pickMainClass(classes: Seq[String]): Option[String] = sbt.SelectMainClass(None, classes) + private def pickMainClassOrWarn(classes: Seq[String], logger: Logger): Option[String] = { + classes match { + case Nil => logger.warn("No main class detected") + case multiple if multiple.size > 1 => logger.warn("Multiple main classes detected. Run 'show discoveredMainClasses' to see the list") + case _ => + } + pickMainClass(classes) + } def doClean(clean: Seq[File], preserve: Seq[File]): Unit = IO.withTemporaryDirectory { temp => diff --git a/notes/0.13.7.markdown b/notes/0.13.7.markdown index 1544e172d..e99f764db 100644 --- a/notes/0.13.7.markdown +++ b/notes/0.13.7.markdown @@ -11,6 +11,7 @@ [@tmandke]: https://github.com/tmandke [@topping]: https://github.com/topping [@WarsawScala]: https://github.com/WarsawScala + [@kretes]: https://github.com/kretes [1237]: https://github.com/sbt/sbt/issues/1237 [1430]: https://github.com/sbt/sbt/issues/1430 [1544]: https://github.com/sbt/sbt/issues/1544 @@ -33,6 +34,7 @@ [1631]: https://github.com/sbt/sbt/pull/1631 [1642]: https://github.com/sbt/sbt/pull/1642 [1683]: https://github.com/sbt/sbt/pull/1683 + [1648]: https://github.com/sbt/sbt/pull/1648 ### Fixes with compatibility implications @@ -49,6 +51,7 @@ - Adds support for publishing to a Maven repository with `file` URLs. [#1618][1618] by [@jsuereth][@jsuereth] - Don't hardcode existing relations in `TextAnalysisFormat`. [#1572][1572] by [@Duhemm][@Duhemm] - Adds `developers` key. [#1590][1590] by [@jedesah][@jedesah] +- Will warn when none or multiple main classes detected. [#1648][1648] by [@kretes][@kretes] ### Bug fixes