Почему я не могу открыть JBoss vfs:/URL?

Мы обновляем наше приложение от JBoss 4 до JBoss 6.

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

В JBoss 4 мы рассмотрим эти банки с загрузчиком классов и найдем URL-адрес jar://, который будет использоваться для чтения флага и отправки его содержимого клиенту.

В JBoss 6, когда мы выполняем поиск, получаем URL-адрес vfs:/. Я понимаю, что это из пакета org.jboss.vfs. К сожалению, когда я вызываю openStream() на этом URL-адресе и читаю из потока, я сразу получаю EOF (read() возвращает -1).

Что дает? Почему я не могу прочитать ресурс, на который ссылается этот URL?

Я попытался получить доступ к базовым VFS-пакетам, чтобы открыть файл с помощью JBoss VFS API, но большая часть API, похоже, является частной, и я не смог найти подпрограмму для перевода из vfs:/URL к объекту VirtualFile VFS, поэтому я не мог никуда добраться.

Я могу попытаться найти файл на диске в JBoss, но этот подход кажется очень неудачным при обновлении.

Наш старый подход состоял в том, чтобы использовать Java Web Start для распространения баннеров на клиенте, а затем искать их в кэше Java Web Start для их извлечения. Но это нарушило каждое незначительное обновление Java, потому что макет кеша изменился.

Ответ 2

Предыдущий ответ по-прежнему дает поток, который нельзя прочитать.

Я обнаружил, что могу получить физический файл, на который ссылается VirtualFile, но возвращаемый результат относится к каталогу с именем contents/в каталоге, который содержит фактический файл, который я ищу. Итак:

 import org.jboss.vfs.*;

  String filename = ...;
  URLConnection conn = new URL("vfs:/...").openConnection();
  VirtualFile vf = (VirtualFile)conn.getContent();
  File contentsFile = vf.getPhysicalFile();
  File dir = contentsFile.getParentFile();
  File physicalFile = new File(dir, filename);
  InputStream is = new FileInputStream(physicalFile);

Какой беспорядок. Я до сих пор не понимаю свой первоначальный вопрос, и именно поэтому JBoss передал мне URL-адрес, который нельзя прочитать? Но, по крайней мере, сейчас я могу двигаться дальше.

Ответ 3

Я обнаружил, что метод getContent() даст мне VirtualFile, который, возможно, я могу использовать. Все еще не объясняет, почему я не могу просто сделать openStream() на vfs:/URL.

import org.jboss.vfs.*;

URLConnection conn = new URL("vfs:/...").openConnection();
VirtualFile vf = (VirtualFile)conn.getContent();
InputStream is = vf.openStream();