如何执行SBT托管的JLine类

时间:2013-07-19 20:01:31

标签: intellij-idea classpath sbt conflicting-libraries jline

我正在开发一个基于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个罐子(略有夸张),有什么建议吗?

1 个答案:

答案 0 :(得分:2)

sbt 0.13(当前位于RC3)移动JLine类,以便用户代码看不到它们。这应避免与您的代码冲突。请注意JLine currently leaks class loaders,因此在多次运行后可能会出现PermGen错误。

您可以在0.13中使用export runtime:fullClasspath导出标准类路径字符串。在早期版本中,您可以编写自定义任务。另请参阅sbt-start-script之类的插件,它们会为您生成运行脚本。

最后,如果可能,请考虑编写不需要交互式提示的测试。例如,sbt本身对其完成库有一些ScalaCheck properties