首先,如果您想到更好的事情,我想请求更正我的问题标题。
让我们从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
命令从头开始重新编译。
答案 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
甚至
SBT_OPTS 中的-Djline.terminal = jline.UnsupportedTerminal
。
如果您尝试从不使用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