четверг, 29 ноября 2012 г.

Загрузка ресурсов из WEB-INF/lib/jar-ов


Проблема

    При попытке доступа к ресурсу из каталога веб-приложения WEB-INF/lib (а именно к jar-библиотеке), по URL полученному из ServletContext-а не получается создать объект класса JarFile. На данный момент проверено под Tomcat 7.x (позже проверю под OAS и WLS)

Решение

    Для того, чтобы ресурс мог потом быть доступен через JarFile (например для чтения описания readme.txt из файла внутри jar-а), необходимо использовать хак :

  1. Добавить к строке, полученного url-а ресурса "jar:" впереди и "!\" позади. 
  2. Использовать url.openConnection()

Пример


// получить список ресурсов в WEB-INF/lib
Set<String> jarLibPaths = servletContext.getResourcePaths("/WEB-INF/lib");

for (String jarPath : jarLibPaths) {

  // так будет неправильное преобразование типа ClassCastException, т.к. открытое соединение не JarURLConnection
//  URL urlBad = servletContext.getResource(jarPath);  
//  JarURLConnection conn = (JarURLConnection) urlBad.openConnection();

  // так будет FileNotFoundException
//   URL urlBad2 = servletContext.getResource(jarPath);  
//   JarFile jarFile = new JarFile(urlBad2.getFile());
//   JarFile jarFile = new JarFile(urlBad2.toString()); // та же проблема

//  URL urlBad3 = new URL("jar:" + servletContext.getResource(jarPath).toString() + "!/");  
//  JarFile jarFile = new JarFile(urlBad3.getFile());   // снова ошибка

  
  // а так всё будет работать
  URL urlOk = 
      new URL("jar:" + servletContext.getResource(jarPath).toString() + "!/");  
  JarURLConnection conn = (JarURLConnection) urlOk.openConnection();
  JarFile jarFile = conn.getJarFile();
}

Комментариев нет:

Отправить комментарий