Не могу загрузить свойства из JAR - PullRequest
0 голосов
/ 03 августа 2011

Уже несколько дней я пытаюсь заставить мой проект Java загрузить некоторые свойства из файла, расположенного в его JAR-файле. Тем не менее, я постоянно получаю нулевой указатель при попытке загрузки в файл.

Иерархия папок содержит файл свойств в / data и все исходные файлы в / emp / ** / ** ...

код

Properties defaultProps = new Properties();
    try {
        InputStream in = getClass().getClassLoader().getResourceAsStream("data/build_info.properties");
        //InputStream in = new URL("file:data/build_info.properties").openStream();

        defaultProps.load(in);
        in.close();
    } catch (FileNotFoundException e) {
        //e.printStackTrace();
    } catch (IOException e) {
        //e.printStackTrace();
    } catch (NullPointerException e){
        Log.E("NPE- Properties not loaded", "properties");
        revision = "Properties file not found";
    }

    if (defaultProps.getProperty("build.major.number") == null) {
        Log.W("Properties not loaded", "properties");
        revision = "Properties file not found";
    } else {
        Log.V("Properties Loaded Successfully", "properties");

        revision = "Version: " + defaultProps.getProperty("build.major.number")
            + "." + defaultProps.getProperty("build.minor.number") + "    "
            + "Revision: "
            + defaultProps.getProperty("build.revision.number");
    }

Ответы [ 3 ]

3 голосов
/ 03 августа 2011

Если data находится в корне вашего фляги, и если build_info.properties находится в директории данных в фляге, и если фляга находится в пути к классам, то getClass().getClassLoader().getResourceAsStream("data/build_info.properties"); найдет этот файл свойств.Вы также можете использовать getClass().getResourceAsStream("/data/build_info.properties");.

. Особенности могут возникнуть, если getClass() возвращает класс, загруженный загрузчиком классов, отличающийся от того, в котором находится ваш jar-файл на пути к классам.

1 голос
/ 03 августа 2011

Вы также можете попробовать -

Thread.currentThread().getContextClassLoader().getResourceAsStream("data/build_info.properties");
0 голосов
/ 24 июля 2013

У меня была такая же проблема с очень простым консольным приложением. В конце концов я нашел подсказку на https://stackoverflow.com/a/1464541/1792291, и я превратил свое консольное приложение в приложение Swing, и вдруг все заработало.

Объяснение в приведенной выше ссылке имеет некоторый смысл: поскольку консольное приложение получает свои свойства (включая CLASSPATH) один раз при создании оболочки, оно не будет знать о пути к классам, определенному во время / для / JVM.

...