Файл свойств загрузки в 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" каталоге проекта Знатока. Когда я выполняю этот код от своего теста junit в Eclipse, он выполняется очень хорошо. Когда проект разработан со Знатоком в банку и включен как зависимость в моем веб-приложении, ему не удается определить местоположение файла свойств. Я знаю, что файл свойств в базовом каталоге зависевшего от банки, я не знаю, как зафиксировать это.

58
задан Paolo Forgia 8 June 2018 в 14:35
поделиться

2 ответа

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

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

EDIT: Обычно вы вызываете getClass().getResourceAsStream(), чтобы получить ресурс в classpath, но поскольку вы получаете ресурс в статическом инициализаторе, вам нужно явно назвать класс, который находится в classloader, из которого вы хотите загрузить. Самый простой подход - использовать класс, содержащий статический инициализатор, например,

[public] class MyClass {
  static
  {
    ...
    props.load(MyClass.class.getResourceAsStream("/someProps.properties"));
  }
}
74
ответ дан 24 November 2019 в 19:02
поделиться

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

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

 my-app 
 | - pom.xml { {1}} `- src 
 | - main 
 | | - java 
 | | `- com 
 | | `- mycompany 
 | | `- приложение 
 | | `- App.java 
 | `- ресурсы 
 | `- META-INF 
 | | - application.properties 
 `- test 
 | - java 
 | `- com 
 | `- mycompany 
 | `- приложение 
 | `- AppTest.java 
` - resources 
 `- test.properties 
 

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

 ... 
 
 // Получить ресурс 
InputStream is = getClass (). getResourceAsStream ("/ test.properties"); 
 
 // Что-то делаем с ресурсом 
 
 ... 
 
14
ответ дан 24 November 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: