找不到jar包外的资源。

6 浏览
0 Comments

找不到jar包外的资源。

我正在尝试读取位于我的代码的jar文件外部的属性,使用ResourceBundle,但无法读取属性文件locations.properties。属性文件位于resource文件夹下,而jarresource文件夹都位于同一个目录下。

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();
}

请指导一下这段代码有什么问题,以及正确读取外部属性文件的方法。

0
0 Comments

问题出现的原因是无法在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,可以使用以下方法进行解决。

0
0 Comments

原因:代码中使用了错误的文件路径,导致无法在jar包外找到资源。

解决方法:首先需要获取当前工作目录的路径,然后只传递目录名给文件对象。然后使用指定的文件名加载资源束。资源束会自动查找目录并加载指定的文件。

下面是完整的代码:

// 获取当前工作目录路径
String currentDirectory = System.getProperty("user.dir");
// 拼接文件路径
String filePath = currentDirectory + "/resource/";
// 创建文件对象
File file = new File(filePath);
// 加载资源束
resourceBundle = ResourceBundle.getBundle(fileName, Locale.getDefault(), loader);

这样就能正确加载指定的文件了。

0