博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jar包读取资源文件报错:找不到资源文件(No such file or directory)
阅读量:2388 次
发布时间:2019-05-10

本文共 3226 字,大约阅读时间需要 10 分钟。

1、遇到问题

(1)Maven项目开发阶段正常运行,Java程序可以读取配置文件

public class Main {    public static void main(String[] args) throws Exception {        Main.readFile("resources/sharepointApp.xml");    }    public static byte[] readFile(String fileName) throws Exception {        String path = SharepointApp.class.getClassLoader().getResource(fileName).getPath();        System.out.println(path);        File file = new File(path);        byte[] buf = new byte[(int) file.length()];        InputStream input=new FileInputStream(fileName);        input.read(buf);        input.close();        return buf;    }}

(2)但是,Maven项目打成jar包后,放到服务器上运行时,却报错,找不到配置文件。

[root@SearchEngine-TEST ~]# java -jar webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar file:/root/webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/resources/sharepointApp.xmlException in thread "main" java.io.FileNotFoundException: file:/root/webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/resources/sharepointApp.xml (No such file or directory)    at java.io.FileInputStream.open0(Native Method)    at java.io.FileInputStream.open(FileInputStream.java:195)    at java.io.FileInputStream.
(FileInputStream.java:138) at java.io.FileInputStream.
(FileInputStream.java:93) at com.cntaiping.tpa.webservice.SharepointApp.readFile(SharepointApp.java:53) at com.cntaiping.tpa.webservice.SharepointApp.sendSms(SharepointApp.java:30) at Main.main(Main.java:22)[root@SearchEngine-TEST ~]#

(3)查看jar结构,对应配置文件存在。

[root@SearchEngine-TEST ~]# jar tf webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar。。。DownloadDemo.classMain.classMETA-INF/maven/cn.hadron/webservice/pom.propertiesMETA-INF/maven/cn.hadron/webservice/pom.xmlresources/a.xmlresources/result.xmlresources/sharepoint.xmlresources/sharepointApp.xmlresources/table.xmlTest.classMETA-INF/maven/commons-io/META-INF/maven/commons-codec/META-INF/maven/commons-codec/commons-codec/META-INF/maven/commons-io/commons-io/META-INF/maven/commons-logging/META-INF/maven/com.github.virtuald/META-INF/maven/com.github.virtuald/curvesapi/META-INF/maven/commons-logging/commons-logging/[root@SearchEngine-TEST ~]#

2、问题分析

由上面运行jar包输出/root/webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/resources/sharepointApp.xml可知,该值是我们通过自定义方法readFile()读取的文件路径,显然这个值不是一般意义上的URL地址。所以jar包中的类源代码用File f=new File(项目内地址)的形式,是不可能定位到文件资源的。

3、解决办法

jar中资源有其专门的URL形式:jar:<url>!/{entry}

可以通过Class类的getResourceAsStream()方法来获取资源文件输入流方式读取文件。

public class FileUtil {
/** * 读取配置文件 * @return */ public static byte[] readConfigFile(String cfgFile) { try { InputStream in=FileUtil.class.getClassLoader().getResource(cfgFile).openStream(); BufferedReader br=new BufferedReader(new InputStreamReader(in)); StringBuilder sb=new StringBuilder(); String line=""; while((line=br.readLine())!=null) { sb.append(line); } return sb.toString().getBytes(); } catch (IOException e) { e.printStackTrace(); return null; } } //省略其他的方法 //主方法 public static void main(String[] args) throws IOException { byte[] buf = FileUtil.readConfigFile("resources/sharepointApp.xml"); }}

转载地址:http://whvab.baihongyu.com/

你可能感兴趣的文章
Hibernate cascade 级联操作
查看>>
马踏棋盘算法 Java实现
查看>>
hibernate hql 多表关联一个小细节
查看>>
普里姆(Prim)算法 Java实现
查看>>
弗洛伊德(Floyd)算法 Java实现
查看>>
拓扑排序(TopologicalSort) Java实现
查看>>
关键路径算法 Java实现
查看>>
PreparedStatement,hibernate查询oracle char类型解决方案
查看>>
ThreadLocal Pager 分页的一种解决方案 (hibernate)
查看>>
二叉排序树(Binary Sort Tree)查找、插入、删除 Java实现
查看>>
平衡二叉树(AVL树)算法 Java实现
查看>>
Middle-题目37:199. Binary Tree Right Side View
查看>>
linux下载edk2链接文件
查看>>
Win10家庭版DOCKER安装(上)
查看>>
Win10家庭版DOCKER安装(下)
查看>>
docker 图形化管理工具Kitematics
查看>>
unittest单元测试框架总结
查看>>
command 'x86_64-linux-gnu-gcc' failed with exit status 1
查看>>
浅谈前端SPA(单页面应用)
查看>>
Insecure default in Elasticsearch enables remote code execution
查看>>