Загрузить файл свойств в JAR? - PullRequest
58 голосов
/ 12 мая 2010

У меня возникают проблемы, когда один из jar-файлов, от которых зависит мое веб-приложение, пытается загрузить файл свойств из jar-файла. Вот код в банке.

static
{
    Properties props = new Properties();
    try 
    {
        props.load(ClassLoader.getSystemResourceAsStream("someProps.properties"));
    } catch (IOException e) 
    {
        e.printStackTrace();
    }
    someProperty = props.getProperty("someKey");
}

Файл свойств находится в моем каталоге "src / main / resources" проекта Maven. Когда я запускаю этот код из моего теста junit в Eclipse, он выполняется просто отлично. Когда проект создается с помощью Maven в jar и включается в качестве зависимости в мое веб-приложение, он не может найти файл свойств. Я знаю, что файл свойств находится в базовом каталоге зависимого от jar, я не знаю, как это исправить.

Ответы [ 2 ]

74 голосов
/ 12 мая 2010

Проблема в том, что вы используете getSystemResourceAsStream. Используйте просто getResourceAsStream. Системные ресурсы загружаются из системного загрузчика классов, который почти наверняка не является загрузчиком классов, в который загружается ваш jar-файл при запуске в качестве веб-приложения.

Это работает в Eclipse, потому что при запуске приложения системный загрузчик классов настраивается с вашим jar как частью его пути к классам. (Например, java -jar my.jar загрузит my.jar в загрузчик классов системы.) Это не относится к веб-приложениям - серверы приложений используют сложную загрузку классов для изоляции веб-приложений друг от друга и от внутренних частей сервера приложений. Например, посмотрите инструкции tomcat classloader и схему используемой иерархии загрузчиков классов.

РЕДАКТИРОВАТЬ: Обычно вы вызываете getClass().getResourceAsStream() для получения ресурса в пути к классам, но когда вы выбираете ресурс в статическом инициализаторе, вам нужно будет явно указать класс, который находится в загрузчике классов, который вы хотите загрузить от. Самый простой подход - использовать класс, содержащий статический инициализатор, например,

[public] class MyClass {
  static
  {
    ...
    props.load(MyClass.class.getResourceAsStream("/someProps.properties"));
  }
}
14 голосов
/ 12 мая 2010

Для записи это задокументировано в Как добавить ресурсы в мой JAR-файл? (показано для модульных тестов, но то же самое относится и к «обычному» ресурсу):

Чтобы добавить ресурсы в путь к классам для ваши юнит-тесты, вы следуете тем же шаблон, как вы делаете для добавления ресурсов в банку, кроме каталога, который вы разместить ресурсы в ${basedir}/src/test/resources. В эта точка у вас будет проект структура каталогов, которая будет выглядеть как следующее:

my-app
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   |   `-- com
    |   |       `-- mycompany
    |   |           `-- app
    |   |               `-- App.java
    |   `-- resources
    |       `-- META-INF
    |           |-- application.properties
    `-- test
        |-- java
        |   `-- com
        |       `-- mycompany
        |           `-- app
        |               `-- AppTest.java
        `-- resources
            `-- test.properties

В модульном тесте вы можете использовать простой фрагмент кода, подобный следующему доступ к ресурсу, необходимому для Тестирование:

...

// Retrieve resource
InputStream is = getClass().getResourceAsStream("/test.properties" );

// Do something with the resource

...
...