Я испытываю затруднения, когда одна из банок, что мое веб-приложение зависит от попыток загрузить файл свойств из банки. Вот код в банке.
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, он выполняется очень хорошо. Когда проект разработан со Знатоком в банку и включен как зависимость в моем веб-приложении, ему не удается определить местоположение файла свойств. Я знаю, что файл свойств в базовом каталоге зависевшего от банки, я не знаю, как зафиксировать это.
Проблема в том, что вы используете 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"));
}
}
Для записи, это задокументировано в Как мне добавить ресурсы в мой 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"); // Что-то делаем с ресурсом ...