【问题标题】:Executing sbt run in current project with ensime emacs使用 ensime emacs 在当前项目中执行 sbt run
【发布时间】:2018-02-06 03:07:27
【问题描述】:

我有一个名为 scala-playground 的 Scala 项目,我使用 sbt ensimeConfigsbt ensimeConfigProject 为 Ensime 生成了配置。

从项目缓冲区运行M-x ensime 时,我可以在Emacs 状态栏中看到Ensime 已连接:它显示Scala[scala-playground]

使用C-c C-b r 运行项目时,会在主目录中启动一个新的sbt 实例,创建$HOME/project 中的目录而不是项目目录并失败:

[info] Loading project definition from /home/user/project
[info] Set current project to user (in build file:/home/user/)
[info] sbt server started at 127.0.0.1:4766
sbt:user> 
sbt:user> run
[error] java.lang.RuntimeException: No main class detected.
[error]     at scala.sys.package$.error(package.scala:27)
[error]     at sbt.Defaults$.$anonfun$runTask$4(Defaults.scala:1199)
[error]     at scala.Option.getOrElse(Option.scala:121)
[error]     at sbt.Defaults$.$anonfun$runTask$3(Defaults.scala:1199)
[error]     at sbt.Defaults$.$anonfun$runTask$3$adapted(Defaults.scala:1198)
[error]     at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error]     at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:42)
[error]     at sbt.std.Transform$$anon$4.work(System.scala:64)
[error]     at sbt.Execute.$anonfun$submit$2(Execute.scala:257)
[error]     at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
[error]     at sbt.Execute.work(Execute.scala:266)
[error]     at sbt.Execute.$anonfun$submit$1(Execute.scala:257)
[error]     at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:167)
[error]     at sbt.CompletionService$$anon$2.call(CompletionService.scala:32)
[error]     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error]     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error]     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error]     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error]     at java.lang.Thread.run(Thread.java:748)
[error] (compile:run) No main class detected.
[error] Total time: 0 s, completed Aug 28, 2017 9:10:03 PM

发生了什么事?

【问题讨论】:

    标签: emacs sbt ensime


    【解决方案1】:

    短篇小说

    删除~/project 文件夹,然后启动emacs。

    说来话长

    如果你曾经在$HOME 目录中运行sbt,它会在那里创建基本的项目结构,主要是projecttarget 目录。然后,如果您打开任何*.scala 文件,emacs (sbt-mode) 将沿着您的路径查找根项目目录。它会在您的$HOME 中找到一个。您可以在文档中看到它:

    Starting from the current default-directory, find a parent
    directory that is an sbt root. An sbt root directory is
    identified by the following rules:
    
       - a directory containing a 'project/build.properties' in it.
    
       - a directory that contains a file matching one of the patterns
        '*.sbt' or 'project/*.scala' file in it.
    

    当前实现的一个问题是这个过程每个缓冲区只执行一次。如果sbt:buffer-project-root变量设置一次就不会更新了。

    您可以通过重新启动 emacs 或通过评估每个打开的缓冲区的 (setq-local sbt:buffer-project-root nil) 来强制一个新值,然后以通常的方式从 emacs 启动 sbt。

    如果你删除 ~/project 并从带有错误值的 sbt:buffer-project-root 的任何缓冲区运行 ensime-sbt,它将在 home 中启动 sbt,从而再次创建 ~/project。再说一遍,最简单的方法是杀死 emacs,删除目录,然后重新启动 emacs。

    【讨论】:

    • 因为这个原因,我真的花了最后 3 个小时把头撞到最近的墙上。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 2013-04-20
    • 2011-10-31
    • 2012-07-10
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    相关资源
    最近更新 更多