Scala 自定义NIO文件系统不';t通过SBT加载';测试任务

Scala 自定义NIO文件系统不';t通过SBT加载';测试任务,scala,sbt,nio2,Scala,Sbt,Nio2,为了进行测试,我使用了内存中的NIO文件系统实现()。我以前利用过它,它在Maven中似乎运行良好 然而,现在,在SBT项目中,不可能初始化新的文件系统 以下是重现问题的最小SBT配置: 导入sbt_ 导入密钥_ 名称:=“testfs” 组织:=“com.example 版本:=“0.1-快照” 规模规避:=“2.11.6” libraryDependencies++={ val scalaTestVersion=“2.2.5” 序号( “org.scalatest”%%“scalatest”

为了进行测试,我使用了内存中的NIO
文件系统
实现()。我以前利用过它,它在Maven中似乎运行良好

然而,现在,在SBT项目中,不可能初始化新的
文件系统

以下是重现问题的最小SBT配置:

导入sbt_
导入密钥_
名称:=“testfs”
组织:=“com.example
版本:=“0.1-快照”
规模规避:=“2.11.6”
libraryDependencies++={
val scalaTestVersion=“2.2.5”
序号(
“org.scalatest”%%“scalatest”%scalaTestVersion%%“测试”,
“org.mockito”%“mockito核心”%“1.10.19”%“测试”,
“de.pfabulist.lindwurm”%“memoryfs”%“0.28.3”%测试”
)}
下面是一个测试:

import de.pfabulist.lindwurm.memory.MemoryFSBuilder
导入org.scalatest.{FlatSpec,MustMatchers}
类FsDummySpec使用MustMatchers扩展了FlatSpec{
它必须在中“初始化FS”{
新建MemoryFSBuilder().watchService(true).name(“testFs”).build()//此处初始化
}
}
运行
sbt测试将导致:

[info] FsDummySpec:
[info] - must init the FS *** FAILED ***
[info]   java.nio.file.ProviderNotFoundException: Provider "memoryfs" not found
[info]   at java.nio.file.FileSystems.getFileSystem(FileSystems.java:224)
[info]   at de.pfabulist.kleinod.paths.Pathss.getOrCreate(Pathss.java:76)
事情是这样的:运行起来应该没有任何问题。我的问题是:为什么,以及如何修复它

纵观整个过程,SBT似乎在某种程度上破坏了类路径,但很难说为什么


注意:非常有趣的是,IntelliJ IDEA的测试运行程序似乎工作顺利,问题只出现在命令行上(在“SBT适当”中)。

openCage的评论暗示了解决方案

事实证明,定制文件系统确实需要一个附加元素,即位于
META-INF/services
中的服务提供商定义文件

如果使用自定义NIO文件系统,则需要使该提供程序定义文件在测试类路径中可用。

最简单的方法可能只是分叉测试VM,即将以下内容添加到
build.sbt

fork-in-Test:=true

java使用文件“META-INF/services/java.nio.file.spi.FileSystemProvider”“查找文件系统提供程序。如果有多个自定义文件系统,则可能存在合并问题。要检查内存是否有问题,请尝试使用其他合适的内存文件系统,例如JimFS。另外,作为memoryfs的作者,我很高兴收到用户的来信,并对结果非常感兴趣。@openCage:哇,谢谢你对这个问题的兴趣!你的评论肯定有帮助,见下面的答案。