如何在 ScalaJS build.sbt 中设置 mainClass?

Posted

技术标签:

【中文标题】如何在 ScalaJS build.sbt 中设置 mainClass?【英文标题】:How to set mainClass in ScalaJS build.sbt? 【发布时间】:2016-04-30 03:17:55 【问题描述】:

如何在ScalaJS build.sbt中设置mainClass?

目前我在 build.sbt 中这样设置主类(见最后一行):

enablePlugins(ScalaJSPlugin)

name := "ScalaJS-Exp"

scalaVersion := "2.11.7"

libraryDependencies += "org.scala-js" %%% "scalajs-dom" % "0.8.1" 
libraryDependencies += "be.doeraene" %%% "scalajs-jquery" % "0.8.0" 

jsDependencies += RuntimeDOM

skip in packageJSDependencies := false

//scalaJSStage in Global := FastOptStage

// uTest settings
libraryDependencies ++= Seq(
    "com.lihaoyi" %%% "utest" % "0.3.1" % "test",
    "com.lihaoyi" %%% "scalatags" % "0.5.4",
    // javascript libs
    "org.webjars" % "jquery" % "1.10.2",
    "org.webjars" % "jquery-ui" % "1.11.4"
)

jsDependencies ++= Seq(
    "org.webjars" % "jquery" % "1.10.2" / "jquery.js",
    "org.webjars" % "jquery-ui" % "1.11.4" / "jquery-ui.js" dependsOn "jquery.js"
)

testFrameworks += new TestFramework("utest.runner.Framework")

persistLauncher in Compile := true
persistLauncher in Test := false

mainClass := Some("htmlExp.HtmlExpApp")

当我运行 sbt 时,我得到:

[warn] Multiple main classes detected.  Run 'show discoveredMainClasses' to see the list
[trace] Stack trace suppressed: run last compile:packageScalaJSLauncher for the full output.
[error] (compile:packageScalaJSLauncher) Cannot write launcher file, since there is no or multiple mainClasses
[error] Total time: 1 s, completed Jan 23, 2016 4:36:02 PM
> show discoveredMainClasses
[info] List(htmlExp.HtmlExpApp, tutorial.webapp.MyApp)
[success] Total time: 0 s, completed Jan 23, 2016 4:36:13 PM
>

如果我从 build.sbt 中删除 mainClass 设置,它没有效果。错误信息与mainClass设置相同或没有它。

当我尝试 runMain htmlExp.HtmlExpApp 时,在 sbt 提示符下它可以工作并运行正确的主类。

如何在 build.sbt 中设置 mainClass 还是让 ScalaJSPlugin 不支持这个设置?

【问题讨论】:

嗯...ScalaJSPlugin 绝对应该支持这个设置。如果你能指出我的回购,我可以看看。不幸的是,这看起来像一个错误。 更正:可能不是错误。看我的回答。 【参考方案1】:

mainClass 需要根据每个配置进行设置:

mainClass in Compile := Some("htmlExp.HtmlExpApp")

如果您只写mainClass := ???,它会为您的整个项目设置mainClass。但是,mainClass 检测是基于每个配置的。因此,自动检测会覆盖您的手动设置。正确覆盖自动检测的唯一方法是为特定配置设置mainClass

请注意,这根本不是 Scala.js 特有的。这同样适用于普通的 JVM 项目(例如,参见 this post)。

【讨论】:

以上是关于如何在 ScalaJS build.sbt 中设置 mainClass?的主要内容,如果未能解决你的问题,请参考以下文章

scalajs_初体验

SBT 插件 - 通过他们的 build.sbt 用户定义的命令配置

未找到价值火花 SBT 项目

如何从 sbt-native-packager 发布到 Google Container Engine?

交叉编译平台

如何在 sbt 子项目 build.sbt 文件中获取对当前项目的引用