主要是因为jar包是一个单独的文件而不是文件夹,不能通过路径的方式来找到配置文件。
一个程序,在开发环境运行得好地地,发布成jar包后,一运行就报错,提示找不到配置文件。提示类似这样的错误:
FileNotFoundException: jar:file:/xxx-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/cert/loadFFmpeg.properties
但事实上,包里文件是存在的。究其原因,主要是因为jar包是一个单独的文件而不是文件夹,不能通过“file:***.jar!\BOOT-INF\classes!\loadFFmpeg.properties”这样的方式来定位jar包内的资源。
原代码
SAXReader xmlReader = new SAXReader(); String path = URLDecoder.decode(this.getClass().getResource("/").getPath(), "UTF-8"); File xmlFile = new File(path + "/jdbcType.xml"); Document document = xmlReader.read(xmlFile);
改为
SAXReader xmlReader = new SAXReader(); InputStream xmlFile = this.getClass().getResourceAsStream("/jdbcType.xml"); Document document = xmlReader.read(xmlFile);
但我这里的方式静态的,没有this,咋改?其实更简单。
原代码
public static <T> T load(String fileName, Class<T> cl) { InputStream is = null; String path = ""; try { path = ResourceUtils.getURL("classpath:").getPath(); path = URLDecoder.decode(path, "utf-8"); path = String.format("%s%s", path, fileName); is = new FileInputStream(path); } catch (FileNotFoundException e) { System.err.println(String.format("找不到配置文件:%s%s", path, fileName)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if (is != null) { Properties pro = new Properties(); try { System.out.println("加载配置文件..."); pro.load(is); System.out.println("加载配置文件完毕"); return (T) load(pro, cl); } catch (IOException e) { System.err.println("加载配置文件失败"); return null; } } return null; }
修改后代码
public static <T> T load(String fileName, Class<T> cl) { /* public static final ProgramConfig config = load("loadFFmpeg.properties", ProgramConfig.class); fileName,配置文件名称;cl,读入配置内容的装填对象 */ InputStream is = cl.getResourceAsStream("/" + fileName); if (is != null) { Properties pro = new Properties(); try { System.out.println("加载配置文件..."); pro.load(is); System.out.println("加载配置文件完毕"); return (T) load(pro, cl); } catch (IOException e) { System.err.println("加载配置文件失败"); return null; } } return null; }