前言
你好! 这是一篇关于Maven中引入资源文件的探讨文章, 写这篇文章的初心是为了记录昨天我写的一个项目中遇到的问题。目前本人还在学习阶段, 如有不足还请多多指正, 谢谢
问题
项目引入了几张图片文件, 但是绝对路径换个电脑肯定不好使了, 于是我用了相对路径, 但是发现打包后图片没有读取到
我打包的形式是带dependencies的形式, (我打算打一包全家福 就一个文件方便嘛)
打包一开始我把resources文件夹下的文件都打包进了jar, 这一个jar里包含了运行的全部需要的内容呀
然而, 资源文件并没有获取到, 这是为什么?
讨论
经过简单测试发现, 打包后的jar包运行时的地址没办法获取到jar包内的文件
因为打包后资源文件包含进了包内, 所以获取不到
考虑到这一点, 我决定将资源文件不打包
而是和jar包放在一个文件夹里就行了
maven编译后, 类文件和资源文件存储在同一个文件夹
maven打包后, Jar包和资源文件也放在同一个文件夹
按照上面的思路, 可以保证IDE中和导出后的jar包运行时都能获取到资源文件, 问题就解决啦
解决方案
第一步
在 src->main->java 文件夹下新建一个包PathPKG 包里新建一个类FilePath
在这个位置建包就行, 建"包内包"之类没试过
package PathPKG;
public class FilePath {
String s1;
public FilePath(){
打包后用来获取jar包的文件目录 / 没打包在IDE里编译后用来获取class文件目录
s1 = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
}
public String filePath(String path) {
转码
try{s1 = java.net.URLDecoder.decode(s1,"utf-8"); }catch(Exception e){ e.getStackTrace(); }
去文件名末尾得到文件夹的目录位置
while(s1.charAt(s1.length()-1) != '/') {
s1 = s1.substring(0, s1.length()-1);
}
System.out.println("读取此文件 : " + s1 + path);
加文件名传回
return s1 + path;
}
}
第二步
在需要资源文件的地方定义一个String str然后用这个类给他赋值
比如我要用一个menu.png就照下面这个写
然后在IDE里把menu.png放进src->main->resources文件夹里
导出jar包后把menu.png和jar包放在一个文件夹里
String str = new FilePath().filePath("menu.png");
接下来就可以用这个str当文件url地址了,
比如我新建一个ImageIcon对象
ImageIcon icon = new ImageIcon(new FilePath().filePath("menu.png"));
大概就是这些内容
之所以放弃了获取包内的资源文件, 是因为我没找到合适的方法, 也有另一方面原因
包外的资源文件可以随意替换啊, 真的很方便!!!