2013-07-19 34 views
1

我正在開發基於JLine的應用程序,我顯然希望在開發時測試它。如何執行SBT託管的JLine類

JLine是一個方便的庫,它爲JVM應用程序提供交互式控制檯功能。

JLine無法在Intellij控制檯中工作,可能是因爲他們已經爲他們自己的惡意需求佔用了Tab鍵,而我想測試的是Tab-Completion,因爲我正在實現一些Tab完成的命令。

我放到SBT控制檯,並嘗試run-main Example simple,但我拋出一個異常,因爲現在類加載器中有兩個jline庫 - 我的一個和SBT使用的,所以應用程序在加載JLine庫時爆炸(Singletons是邪惡的)....

唉...在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)) 

我知道我可以分析該名單,顯然空格或逗號將是一個完全可行的分隔符,但斯卡拉開發人員似乎並沒有這樣連線...

但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個罐子時(有點誇張),有什麼建議嗎?

回答

2

sbt 0.13(當前位於RC3)移動JLine類,以便它們對用戶代碼不可見。這應該避免與您的代碼衝突。請注意,JLine currently leaks class loaders,因此幾次運行後您可能會收到PermGen錯誤。

您可以在0.13中使用export runtime:fullClasspath導出標準類路徑字符串。在早期版本中,您可以編寫自定義任務。另請參閱sbt-start-script等插件,它們會爲您生成運行腳本。

最後,如果可能,請考慮編寫不需要交互式提示的測試。例如,sbt本身的完成庫有一些ScalaCheck properties

+0

嗨馬克,感謝您的詳細回覆。我沒有真正運行測試,這是爲了運行主類(它使用jline輸入)。無論如何,偉大的迴應,thx! – irishjava