我正在开发一个基于JLine的应用程序,我显然希望在开发时测试它。
JLine是一个方便的库,为JVM应用程序提供交互式控制台功能。
JLine在Intellij控制台中不起作用,可能是因为他们为了他们自己的恶劣需求而使用了tab键,我想要测试的是tab-completion,因为我正在实现一些tab-completed命令。
我转到SBT控制台,尝试run-main Example simple
,但我抛出一个异常,因为类加载器中现在有两个jline库 - 我的那个,以及SBT使用的jline库,因此应用程序在加载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开发人员似乎并没有那样连接......
但是当我在它的控制台中时,如果我从实际的UNIX控制台执行该命令,SBT似乎只解析该命令,如下所示:
% 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个罐子(略有夸张),有什么建议吗?
答案 0 :(得分:2)
sbt 0.13(当前位于RC3)移动JLine类,以便用户代码看不到它们。这应避免与您的代码冲突。请注意JLine currently leaks class loaders,因此在多次运行后可能会出现PermGen错误。
您可以在0.13中使用export runtime:fullClasspath
导出标准类路径字符串。在早期版本中,您可以编写自定义任务。另请参阅sbt-start-script之类的插件,它们会为您生成运行脚本。
最后,如果可能,请考虑编写不需要交互式提示的测试。例如,sbt本身对其完成库有一些ScalaCheck properties。