Java 使用hadoop文件系统读取本地文件系统中的jar文件
我们有一个maven项目,其中resources目录中的一些文件被复制到jar文件的根目录中。我有以下代码,在JUnit测试期间可以正常工作,但一旦我尝试从jar执行它,就会停止工作Java 使用hadoop文件系统读取本地文件系统中的jar文件,java,maven,hadoop,io,Java,Maven,Hadoop,Io,我们有一个maven项目,其中resources目录中的一些文件被复制到jar文件的根目录中。我有以下代码,在JUnit测试期间可以正常工作,但一旦我尝试从jar执行它,就会停止工作 Configuration configuration = new Configuration(); String pathString = MainClass.class.getClassLoader().getResource("dir").getPath();
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能够理解的路径。异常
java.io.IOException:scheme:jar没有文件系统
意味着您无法创建文件
对象或打开FSDataInputStream
(Mahout所做的)使用引用jar
对象内部某个内容的URI
方案file
和hdfs
都有文件系统
实现,因此,我想这是唯一适合您的解决方案,因为您需要调用NaiveBayesModel.materialize()
,就是将jar的dir
目录中的文件转储到我提到的两个文件系统
中的一个,然后从中创建一个路径
另一方面,您可以尝试重新生成,这是NaiveBayesModel
的实例化
我没有使用Mahout的经验,但我想这是一个很好的起点,希望能有所帮助。为什么需要在运行时获取路径?@JoãoMelo,这样我们就可以在各种环境中运行它(所有环境的设置都略有不同)以及在本地运行以进行测试。Path
构造函数实例化一个URI
对象。在第二种情况下,您是否尝试过在字符串的开头插入jar:
?@JoãoMelo感谢您的提示,我刚刚尝试过,但后来我得到了:java.io.IOException:No FileSystem for scheme:jar at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1408),我有点期待这一点。只要阅读一个关于jar
scheme-)的答案就可以了。好吧,我试着重新实现materialze(),我使用getResourceAsStream成功地实现了这一点,并将其转换为DataInputStream。问题是,除了模型之外,我还需要阅读标签、字典和df计数。。。重新实现所有这些似乎是一个糟糕的解决方案。我正在考虑实现一个hadoop文件系统,它可以读取jar文件。。。我很惊讶这还不存在@艾古弗,你找到解决办法了吗?我想实现一个从JAR读取的文件系统是不可行的。不幸的是,我没有时间尝试。我想这是可能的,但这不是小事。我们最终只是将文件移出并使用配置文件指向它们的位置。