Почему SBT 0.7.7 не работает правильно в моей системе Linux?(подробности дела внутри) - PullRequest
6 голосов
/ 14 октября 2011

Прежде всего, я хотел бы попросить исправить заголовок моего вопроса, если вам что-то придет в голову.

Давайте рассмотрим пример веб-службы Lift REST из Simply Lift.книга Дэвида Поллака здесь .

Если я открою консоль Windows (Windows XP SP3, все обновления, Oracle JDK 7) внутри каталога и запустлю "sbt" (sbt.bat), все работает просто отлично.Но в случае, если я пытаюсь сделать то же самое (но с использованием «./sbt») в Linux (XUbuntu 11.10, OpenJDK 6, OpenJDK 7, Oracle JDK 7 (пробовал все из них)), SBT возвращает (вместо перехода на консоль SBTрежим) сразу же, как он сделал свою работу.Это означает, что команда может быть просто ./sbt, она немедленно возвращается (после завершения автоматического обслуживания проекта) или ./sbt jetty-run - она ​​просто запускает веб-сервер и немедленно выключает ее .

Более того, веб-сервис, который я разработал для моего проекта, компилируется и работает нормально в Windows, но не может быть откомпилирован (используя ./sbt compile) в Linux (той же версией SBT).Ошибка «исходный файл» /.../src/main/scala/code/lib/FooBar.scala;src/main/scala/bootstrap/liftweb/Boot.scala «не найден», где «FooBar.scala "- это объект, где я делаю все подачи (напрямую вызывается из Boot.scala).

Есть идеи, в чем может быть причина и как ее исправить?

ОБНОВЛЕНИЕ: Причиной первой проблемы (возвращение SBT в оболочку вместо предложения консоли SBT) является то, что файл был извлечен в Windows и имел CR + LF вместо окончания строки LF.Решением для не найденных исходных файлов было использование команды clean для перекомпиляции с нуля.

Ответы [ 3 ]

2 голосов
/ 24 октября 2011

Причиной первой проблемы (возвращение SBT в оболочку вместо предложения консоли SBT) является то, что файл был извлечен в Windows и имел CR + LF вместо окончания строки LF.Решением для не найденных исходных файлов было использование команды clean для перекомпиляции с нуля.

1 голос
/ 21 октября 2011

Первое, что происходит, когда вы просто набираете:

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"

Хотя я бы подождал с этими опциями, поскольку они, вероятно, не являются проблемой здесь (однако обязательно добавьте CMSClassUnloadingEnable позже, когда SBT работает, поскольку это гарантирует, что определения класса Scala, сгенерированные динамически при запуске SBT, будут выгружены когда они не используются, что предотвращает ошибки памяти - см. дополнительную информацию здесь ):

Также рассмотрите возможность использования одного из

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

или даже

-Djline.terminal = jline.UnsupportedTerminal

в вашем SBT_OPTS .

Наконец, что произойдет, если вы попробуете никогда не использовать версию SBT? (вы можете попробовать запустить версию SBT 0.11 примера лифта, найденную здесь https://github.com/lacy/lift-quickstart).

0 голосов
/ 20 октября 2011

Замените ваш скрипт Linux на:

#!/bin/bash

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

В ваших настройках:

Ваш скрипт устанавливает Xss (размер стека потоков).В Linux вам иногда нужно изменить (через ulimit) настройки для стека на поток (ulimit -s), так как у вас могут возникнуть конфликты на уровне SO, которые могут вызывать «убийство» в ваших потоках.Если у вас нет очень важной причины установить этот флаг, просто удалите его и разрешите JVM управлять этим.

Возможно, вы захотите поставить Xms вместо Xss, хотя тогда 2M сделает этот флаг неактуальным (кучаслишком мал, чтобы быть практичным)

Флаг -XX: + CMSClassUnloadingEnabled позволяет GC подметать пространство Перми.Это не должно быть необходимо для SBT.Как вы можете прочитать здесь , параметры PermGen будут только откладывать проблемы PermGen, поэтому, если у вас есть проблемы с PermGen при работе с Jetty, просто добавьте больший PermGen через -XX: MaxPermSize

...