Как я могу выполнить класс JLine, управляемый SBT

Я разрабатываю приложение на основе JLine, которое я, очевидно, хотел бы протестировать по мере разработки.

JLine — это удобная библиотека, которая предоставляет интерактивную консольную функциональность приложениям JVM.

JLine не работает в консоли Intellij, вероятно, потому, что они присвоили клавишу табуляции для своих гнусных нужд, и я хочу протестировать завершение табуляции, потому что я реализую некоторые команды, завершаемые табуляцией.

Я захожу в консоль SBT и пытаюсь выполнить run-main Example simple, но выбрасываю исключение, потому что теперь в загрузчике классов есть две библиотеки jline — моя и та, которую использует SBT, поэтому приложение взрывается при загрузке библиотеки JLine (синглтоны — это зло). ...

Вздох... Немного поковырявшись в консоли SBT, я обнаружил, что могу запустить:

> show runtime:managed-classpath

[info] List(Attributed(/home/bryan/.sbt/boot/scala-2.10.0/lib/scala-library.jar), Attributed(/home/bryan/.ivy2/cache/org.parboiled/parboiled-scala_2.10/bundles/parboiled-scala_2.10-1.1.5.jar), Attributed(/home/bryan/.ivy2/cache/org.parboiled/parboiled-core/bundles/parboiled-core-1.1.5.jar), Attributed(/home/bryan/.ivy2/cache/jline/jline/jars/jline-2.10.jar))

Я знаю, что могу разобрать этот список, очевидно, что пробелы или запятые были бы вполне жизнеспособным разделителем, но разработчики Scala, похоже, не подключены таким образом...

Но SBT, кажется, анализирует эту команду только тогда, когда я нахожусь в своей консоли, если я выполняю эту команду из реальной консоли UNIX, например так:

% sbt show runtime:managed-classpath
[info] Loading project definition from /common/moon_excel/project
[info] Set current project to moon_excel (in build file:/common/moon_excel/)
[error] Not a valid command: show (similar: shell)
[error] Expected whitespace character
[error] Expected '/'
[error] Expected ':'
[error] Not a valid key: show (similar: show-timing)
[error] show

Я пытаюсь автоматизировать процесс, когда у меня есть 100 банок в пути к классам (небольшое преувеличение), какие-либо предложения?


person irishjava    schedule 19.07.2013    source источник


Ответы (1)


sbt 0.13 (в настоящее время в RC3) перемещает классы JLine, чтобы они не были видны пользовательскому коду. Это должно избежать конфликтов с вашим кодом. Обратите внимание, что JLine в настоящее время допускает утечку загрузчиков классов, поэтому вы можете получить ошибки PermGen после нескольких запусков.

Вы можете использовать export runtime:fullClasspath в версии 0.13 для экспорта стандартной строки пути к классам. В более ранних версиях вы можете написать пользовательскую задачу. См. также плагины, такие как sbt-start-script, которые генерируют для вас сценарий запуска.

Наконец, если возможно, рассмотрите возможность написания тестов, которым не требуется интерактивная подсказка. Например, в самом sbt есть некоторые Свойства ScalaCheck для библиотеки завершения.

person Mark Harrah    schedule 22.07.2013
comment
Привет Марк, спасибо за подробный ответ. На самом деле я не запускаю тесты, это для запуска основного класса (который использует jline для ввода). В любом случае, отличный ответ, спасибо! - person irishjava; 23.07.2013