Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用hadoop文件系统读取本地文件系统中的jar文件_Java_Maven_Hadoop_Io - Fatal编程技术网

Java 使用hadoop文件系统读取本地文件系统中的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();

我们有一个maven项目,其中resources目录中的一些文件被复制到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能够理解的路径。

异常
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读取的文件系统是不可行的。不幸的是,我没有时间尝试。我想这是可能的,但这不是小事。我们最终只是将文件移出并使用配置文件指向它们的位置。