找不到jar包外的资源。
找不到jar包外的资源。
我正在尝试读取位于我的代码的jar文件外部的属性,使用ResourceBundle
,但无法读取属性文件locations.properties
。属性文件位于resource
文件夹下,而jar
和resource
文件夹都位于同一个目录下。
myDir --> myJar.jar --> resource -->locations.properties
我不知道下面的代码有什么问题:
public static ResourceBundle getResourceBundle(String fileName) throws MalformedURLException{ if (resourceBundle == null) { File file = new File("resource/"+fileName); URL[] urls = { file.toURI().toURL() }; ClassLoader loader = new URLClassLoader(urls); resourceBundle = ResourceBundle.getBundle(fileName, Locale.getDefault(), loader); } return resourceBundle; }
这是如何调用ResourceBundle
对象的方式:
ResourceBundle locationBundle = null; try { locationBundle = ReadPropertyUtil.getResourceBundle(propFileName); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); }
请指导一下这段代码有什么问题,以及正确读取外部属性文件的方法。
问题出现的原因是无法在jar文件之外找到资源。解决方法是获取jar文件的路径,并获取其父文件夹。然后使用该路径以及属性文件的名称,在InputStreamPath中加载属性文件。
具体代码如下:
Properties prop = new Properties(); try { File jarPath = new File(YourClassNameInJar.class.getProtectionDomain().getCodeSource().getLocation().getPath()); String propertiesPath = jarPath.getParentFile().getAbsolutePath(); System.out.println(" propertiesPath-" + propertiesPath); prop.load(new FileInputStream(propertiesPath + "/resource/locations.properties")); } catch (IOException e1) { e1.printStackTrace(); }
如果使用ResourceBundle,可以使用以下方法进行解决。
原因:代码中使用了错误的文件路径,导致无法在jar包外找到资源。
解决方法:首先需要获取当前工作目录的路径,然后只传递目录名给文件对象。然后使用指定的文件名加载资源束。资源束会自动查找目录并加载指定的文件。
下面是完整的代码:
// 获取当前工作目录路径 String currentDirectory = System.getProperty("user.dir"); // 拼接文件路径 String filePath = currentDirectory + "/resource/"; // 创建文件对象 File file = new File(filePath); // 加载资源束 resourceBundle = ResourceBundle.getBundle(fileName, Locale.getDefault(), loader);
这样就能正确加载指定的文件了。