2

我正在开发一个基于 JLine 的应用程序,我显然想在开发时对其进行测试。

JLine 是一个方便的库,它为 JVM 应用程序提供交互式控制台功能。

JLine 在 Intellij 控制台中不起作用,可能是因为他们已经将 tab 键用于他们自己的邪恶需求,而我要测试的是 tab-completion,因为我正在实现一些 tab-completed 命令。

我掉到 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 个 jar 时(有点夸张),我正在尝试自动化这个过程,有什么建议吗?

4

1 回答 1

2

sbt 0.13(目前在 RC3)移动 JLine 类,使它们对用户代码不可见。这应该避免与您的代码冲突。请注意,JLine当前会泄漏类加载器,因此您可能会在多次运行后得到 PermGen 错误。

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

最后,如果可能,考虑编写不需要交互式提示的测试。例如,sbt 本身有一些ScalaCheck 属性用于它的完成库。

于 2013-07-22T17:59:50.947 回答