我刚刚开始使用Scala并遇到了一个令我难过的问题,但我猜我错过了一些简单的东西。
我按照说明使用Clapper ClassFinder: http://thoughts.inphina.com/2011/09/15/building-a-plugin-based-architecture-in-scala/
val classpath = List("./plugins").map(new File(_))
val finder = ClassFinder(classpath)
val classes = finder.getClasses
val classMap = ClassFinder.classInfoMap(classes)
执行第一行后,我看到classpath设置为 列表(\插件) 我在Windows上运行它,所以斜线的交换似乎没问题。 但我希望看到一个File对象列表,虽然我不确定这个Scala语法,也许我在Scala IDE中遗漏了一些东西。类的值显示“空迭代器”。
似乎没有在我指定的路径中找到任何文件。我尝试使用绝对路径,但我得到了相同的结果。我在插件目录中有一个jar文件,我希望它能找到。 plugins目录位于我正在使用的Play2项目的根目录。
编辑--- 我确实发现当我明确列出一个罐子的路径时,它能够找到它:
val classpath = List("./plugins/myPlugin.jar").map(new File(_))
但我想找到目录中的所有jar文件。 以下不起作用:
val classpath = List("./plugins/*").map(new File(_))
也没有这样做:
val classpath = List("./plugins/*.jar").map(new File(_))
答案 0 :(得分:1)
如果你的目标是列出所有jar文件,你可以使用以下代码:
val classpath = List("./plugins").map(path => Option(new File(path).listFiles).getOrElse(Array.empty[java.io.File]) filter(file => file.isFile && file.getName.endsWith(".jar"))).flatten
答案 1 :(得分:1)
根据this issue对Github上的ClassFinder仓库判断,这可能是一个错误。
我认为您需要创建一个明确的jar文件列表或列出文件夹中包含的文件,如:
val classpath =(new File("./plugins")).listFiles.filter(_.getName.endsWith(".jar"))
编辑:从粗略地看一眼ClassFinder's source on GitHub我认为这不是一个错误。 ClassFinder在jar或zip文件中或直接在文件夹中搜索.class文件,但看起来它不会递归地混合这些东西(即如果你给它一个文件夹,它将直接在文件夹中查找类,但它不会在文件夹中查找jar中的类)