Подтвердить что ты не робот

Как загрузить ресурс из файла 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 корневого приложения?

Спасибо и с уважением, Амит Патель

4b9b3361

Ответ 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, который вы только что включили в свой путь сборки.