flink任务读取资源文件问题

21 篇文章 2 订阅

问题描述

写一个flink实时任务,任务启动时解析资源目录下的xml文件。代码写好了,idea上测试代码也ok,但一提交到集群环境运行的时候,就提示找不到文件。

目录结构如下

示例代码如下

try {

     SAXReader saxReader = new SAXReader();
     URL url = this.getClass().getResource("/cjm.xml");
     File inputXml = new File(url.getFile());
     Document document = saxReader.read(inputXml);
     ……
} catch (DocumentException e) {
    logger.error("parse xml fail, msg:" + e.getMessage());
}

运行报错如下

parse xml fail, msg:file:/var/folders/hr/lpgk_yqs5kbg8jfwk6g0n1q40000gn/T/blobStore-aa2516aa-2bf0-4b13-a650-e92c9f5b8628/job_8eaee161599d0d41ceaf95231673fe4c/blob_p-58b0a523357b29468bb5d1d06c642852a4f344e3-b2061c431c14ad68dccdc7f5f3700b16!/cjm.xml (No such file or directory)

java解析文件方法比c++丰富多了,集群环境读取文件比本地环境读取文件又有不少差异。

问题解决 

直接上解决后的示例代码

try {

    SAXReader saxReader = new SAXReader();
    InputStream in = this.getClass().getResourceAsStream("/cjm.xml");
    Document document = saxReader.read(in);
    ……
} catch (DocumentException e) {
    logger.error("parse xml fail, msg:" + e.getMessage());
}

问题注意 

  • 要用getResourceAsStream,不要用getResource,后者在本地运行测试代码的时候可以,提交集群运行的时候就出错了。
  • 参数一定要带"/",如文件cjm.xml在resources目录下,参数为"/cjm.xml";如文件cjm.xml在resources/file目录下,参数则为"/file/cjm.xml"。
  • pom文件下面一段可以不需要,有些文章提到添加这段,实测不必。

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
            </includes>
        </resource>
    </resources>

</build>

  • 有空的话研究下面几种读取资源文件的差别。网上也能搜到很多文章,但很多也有问题,还是自己验证比较靠谱。

this.getClass().getResource("cjm.xml");

this.getClass().getResource("/cjm.xml");

this.getClass().getClassLoader().getResource("cjm.xml");

this.getClass().getClassLoader().getResource("/cjm.xml");

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值