为什么SBT 0.7.7在我的Linux系统上没有正常工作? (案例详情)

时间:2011-10-14 08:33:04

标签: linux scala ubuntu lift sbt

首先,如果您想到更好的事情,我想请求更正我的问题标题。

让我们从David Pollak撰写的Simply Lift书中获取Lift REST Web服务示例here

如果我在目录中打开Windows(Windows XP SP3,所有更新,Oracle JDK 7)控制台并运行“sbt”(sbt.bat),一切正常。但是如果我尝试在Linux中使用相同的(但使用“./sbt”)(XUbuntu 11.10,OpenJDK 6,OpenJDK 7,Oracle JDK 7(尝试了所有这些)),SBT返回(而不是转到SBT控制台)模式)立即完成它的工作。这意味着命令可能只是./sbt它立即返回(在完成自动项目维护之后),或者是./sbt jetty-run - 它只是启动Web服务器并且立即关闭它< / em>的

此外,我为我的项目开发的Web服务编译并在Windows上运行正常,但无法在Linux上(使用./sbt compile)编译(通过相同版本的SBT)。错误是“源文件'/.../src/main/scala/code/lib/FooBar.scala;src/main/scala/bootstrap/liftweb/Boot.scala'找不到”,其中“FooBar。 scala“是我执行所有服务的对象(直接从Boot.scala调用)。

可能是什么原因以及如何解决这个问题?

更新:第一个问题(SBT返回shell而不是提供SBT控制台)的原因似乎是在Windows上检出文件并且有CR + LF而不是仅仅LF行结束。找不到源文件的解决方案只是使用clean命令从头开始重新编译。

3 个答案:

答案 0 :(得分:2)

第一个问题(SBT返回shell而不是提供SBT控制台)的原因似乎是在Windows上检出文件并且使用CR + LF而不是仅仅LF行结束。找不到源文件的解决方案只是使用clean命令从头开始重新编译。

答案 1 :(得分:1)

首先输入以下内容时会发生什么:

  

java -jar sbt-launch.jar

直接从放置 sbt-launch.jar 的文件夹中的命令行?如果 sbt-launch.jar 与sbt脚本位于同一文件夹中,则可以将脚本编辑为如下所示:

#!/bin/sh
test -f ~/.sbtconfig && . ~/.sbtconfig
java -Xmx512M ${SBT_OPTS} -jar dirname $0/sbt-launch.jar "$@" 

dirname $ 0 构造返回sbt脚本文件夹的完整路径,而不包含脚本的文件名。使用 $ SBT_OPTS 变量可以试验各种JVM选项,例如:

  

SBT_OPTS =“ - Xss2M -XX:+ CMSClassUnloadingEnabled”

虽然我会等待这些选项,因为它们可能不是这里的问题(但是当SBT正在运行时确保稍后添加 CMSClassUnloadingEnable ,因为它确保在运行SBT时动态生成Scala类定义在未使用时卸载,从而防止内存错误 - 请参阅更多信息here):

还要考虑使用

之一
  

-Djline.terminal = scala.tools.jline.UnixTerminal

甚至

  

-Djline.terminal = jline.UnsupportedTerminal

SBT_OPTS 中的

如果您尝试从不使用SBT版本会发生什么? (您可以尝试运行此处https://github.com/lacy/lift-quickstart找到的电梯示例的SBT 0.11版本。)

答案 2 :(得分:0)

用以下代码替换您的Linux脚本:

#!/bin/bash

java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@"

在您的设置上:

您的脚本设置Xss(线程堆栈大小)。在Linux中,您有时需要更改(通过ulimit)每个线程堆栈的设置(ulimit -s),因为您可能在SO级别发生冲突,这可能会触发线程上的“kill”。除非你有一个非常重要的理由设置这个标志,否则只需删除它并让JVM管理它。

也许你想要把Xms而不是Xss,虽然那么2M会使这个标志无关紧要(堆太小而不实用)

标志-XX:+ CMSClassUnloadingEnabled允许GC扫描Perm空间。它不应该是sbt。正如您可以阅读here,PermGen选项只能解决PermGen问题,因此如果您在运行Jetty时遇到PermGen问题,只需通过-XX添加更大的PermGen:MaxPermSize