Как загрузить ресурс из файла jar, упакованного в военный файл?
Мне нужно загрузить файл свойства из банки. Банка включена в военный файл. Вот структура
ROOT.war
WEB-INF
lib
my.jar
here my.jar has following structure
my.jar
com
test
myservlet.class
WEB-INF
test.property
Теперь я написал следующий код в одном из своих сервлетов следующим образом:
InputStream stream = getServletContext().getResourceAsStream("/WEB-INF/test.properties");
Properties prop = new Properties();
prop.load(stream );
но над кодом я получил поток как null. Если я поместил файл свойств в ROOT.war/WEB-INF, он отлично работает. Я уверен, что если путь в getResourceAsStream начинается с '/', чем он ищет ресурс в контексте root. Но как я могу прочитать ресурс, который лежит в банке, которая снова найдена в WEB-INF/lib корневого приложения?
Спасибо и с уважением,
Амит Патель
Ответы
Ответ 1
Поместите его в корневой каталог JAR и получите его с помощью класса classloader вместо servletcontext.
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("test.properties");
// ...
Соглашение о папке /WEB-INF
относится к файлам WAR, а не к файлам JAR. Избавиться от этого. Если вам действительно нужна отдельная папка JAR, которая должна быть частью пути к классам, вместо этого используйте /META-INF
.
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("META-INF/test.properties");
// ...
Ответ 2
Вы можете получить доступ к любому ресурсу в стандартном пути класса из заданного экземпляра
this.getClass().getResourceAsStream("name");
например, из вашего класса "myservlet" ( "Бад-именование" ).
getServletContext().getResourceAsStream()
обращается к контенту в контексте базового каталога веб-приложения.
Кажется, что плохой стиль включает в себя каталог WEB-INF в банке - вы можете вызвать путаницу. Вы не можете найти лучшее имя?
Ответ 3
Это то, что я нашел, и это сработало для меня. Помощь, оказанная @BalusC, работала для меня. Я сопоставил то, что нашел, и как я убедился, что он работает.
У меня есть проект maven со следующей структурой, как показано ниже
![project structure]()
Теперь, когда я создаю этот проект; банка выглядит как
![enter image description here]()
и здесь queries.properties перемещается в папку "META-INF". Теперь, если в этом банке есть класс, который пытается использовать этот файл свойств, используя
Thread.currentThread().getContextClassLoader().getResourceAsStream("queries.properties")
полагая, что один и тот же файл все равно можно получить в папке ресурсов, как показано в структуре проекта, это неправильно. Правильный путь - доступ через папку META-INF
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream is = classLoader.getResourceAsStream("META-INF/queries.properties");
Как я проверил
Просто создайте простой проект java и включите только что созданный банку в свой путь сборки и создайте экземпляр класса, который имеет инструкции ClassLoader, как указано выше. Ваш код в этом новом проекте Java должен выглядеть как
public static void main(String[] args){
new Queries();
}
где Queries
- это класс в jar, который вы только что включили в свой путь сборки.