我们有一个maven项目,其中包含资源目录中的一些文件,这些文件被复制到jar文件的根目录中。我有以下一些代码在JUnit测试期间工作正常,但一旦我尝试从jar执行它就停止工作
Configuration configuration = new Configuration();
String pathString = MainClass.class.getClassLoader().getResource("dir").getPath();
Path path = new Path(pathString);
logger.debug(path);
FileSystem fs = path.getFileSystem(configuration);
if (fs.exists(path)) {
logger.debug("WOOOOO");
} else {
logger.debug("BOOOOO");
}
测试时,输出为:
DEBUG: /path/to/project/target/test-classes/dir
DEBUG: WOOOOO
从jar运行时我得到:
DEBUG file:/path/to/jar/project.jar!/dir
DEBUG BOOOOO
毋庸置疑,jar文件位于正确的位置,而dir位于该jar的根目录中。
如果你想知道为什么我们这样做,下半部分是一个小测试摘录,它模仿了Mahout中的NaiveBayesModel.materialize()。我们只需要能够创建一个Mahout将理解的路径。
答案 0 :(得分:1)
异常java.io.IOException: No FileSystem for scheme: jar
表示您无法创建File
对象或打开FSDataInputStream
(Mahout会做什么),URI
引用内部内容一个jar
对象。
方案file
和hdfs
有FileSystem
个实现,因此,我认为唯一的解决方案,因为你要调用NaiveBayesModel.materialize()
,就是转储文件在dir
的{{1}}目录中,将其放入我提到的两个jar
之一,然后从中创建FileSystem
。
另一方面,您可以尝试重现what Mahout does,这是Path
的实例化。
我没有Mahout的经验,但我想这是一个很好的开始,希望它有所帮助。