2012-11-30 28 views
0

我刚刚开始与斯卡拉,并遇到了一个问题,让我难住,但我猜我错过了一件容易的事情。PlayFramework2斯卡拉文件地图

我下面的说明使用梆子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

只是对语法进行澄清:'List(...)。map(...)'意味着“将函数映射到map中,并将其应用于列表中的每个元素”。这里你的列表只有一个元素('“./plugins”'),所以'List(“./ plugins”)。map(new File(_))'等同于'List(new File(“./ plugins “))' –

回答

1

来看通过Github上的ClassFinder repo的this issue它可能是一个错误。

我认为你需要创建的jar文件的明确列表,或列出包含在您的文件夹中,如那些:

val classpath =(new File("./plugins")).listFiles.filter(_.getName.endsWith(".jar")) 

编辑:从一个粗略地看一眼在ClassFinder's source on GitHub我认为这不是一个错误。 ClassFinder在罐子或zip文件中搜索.class文件,或者直接在文件夹中搜索.class文件,但它看起来不会将这些东西递归地混合(即如果您给它一个文件夹,它将直接在文件夹中查找类,但它不会在文件夹中寻找罐子里的类)

+0

Github的bug很有趣 - 这是我看到的同样的问题。我尝试了获取类路径的方法,它对我很有用。谢谢。 –

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 
+0

哇。我喜欢你像List一样开始(“./ plugins”),但其余的我不明白。我仍然在Scala中加速。我想我需要再多研究一下。谢谢。 –