我正在开发一个基于JLine的应用程序,显然我想在开发时对其进行测试。
JLine是一个方便的库,它为JVM应用程序提供了交互式控制台功能。
JLine不能在Intellij控制台中工作,可能是因为他们为了自己的邪恶需求而盗用了tab键,而我想测试的是tab键完成,因为我正在实现一些tab键完成的命令。
我跳到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开发人员似乎不是这样的……
但是,如果我从实际的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个jars时(有点夸张),有什么建议吗?
发布于 2013-07-23 01:59:51
SBT0.13(目前在RC3)移动了JLine类,这样用户代码就看不到它们了。这应该可以避免与您的代码冲突。注意JLine currently leaks class loaders,所以你可能会在几次运行后得到PermGen错误。
您可以在0.13中使用export runtime:fullClasspath导出标准类路径字符串。在早期版本中,您可以编写自定义任务。另请参阅sbt-start-script等插件,它们会为您生成运行脚本。
最后,如果可能的话,考虑编写不需要交互式提示的测试。例如,sbt本身为其完成库提供了一些ScalaCheck properties。
https://stackoverflow.com/questions/17754550
复制相似问题