2011-02-04 19 views
11

Uaktualniamy naszą aplikację z JBoss 4 na JBoss 6.Dlaczego nie mogę otworzyć pliku JBoss vfs:/URL?

Kilka elementów naszej aplikacji jest dostarczanych do klienta w nietypowy sposób: słoiki są wyszukiwane wewnątrz naszej aplikacji i wysyłane do klienta z serwlet, w którym klient wyodrębnia je w celu uruchomienia pewnych funkcji wsparcia.

W JBoss 4 szukaliśmy tych słoików za pomocą programu ładującego klasy i znaleźliśmy jar: // URL, który byłby używany do odczytu słoika i wysyłania jego zawartości do klienta.

W JBoss 6 podczas wykonywania wyszukiwania otrzymujemy vfs:/URL. Rozumiem, że jest to z pakietu org.jboss.vfs. Niestety, gdy wywołuję metodę openStream() na tym adresie URL i czytam ze strumienia, natychmiast otrzymuję EOF (read() zwraca -1).

Co daje? Dlaczego nie mogę przeczytać zasobu, do którego odnosi się ten adres URL?

Próbowałem próbować uzyskać dostęp do podstawowych pakietów VFS, aby otworzyć plik za pośrednictwem interfejsu JBoss VFS API, ale większość interfejsu API wydaje się być prywatna i nie mogłem znaleźć procedury do przetłumaczenia z pliku vfs:/Adres URL do obiektu VirtualFile VFS, więc nigdzie nie mogłem się dostać.

Mogę spróbować znaleźć plik na dysku w JBoss, ale to podejście brzmi bardzo podatne na awarię podczas aktualizacji.

Nasze stare podejście polegało na użyciu Java Web Start w celu dystrybucji słoików na kliencie, a następnie sprawdzenia ich w pamięci podręcznej Java Web Start, aby je rozpakować. Ale to zepsuło każdą drobną aktualizację Javy, ponieważ zmienił się układ pamięci podręcznej.

+0

org.apache.commons.vfs. *; ten import również pomaga w tym zakresie. –

+0

Przykro mi to mówić, że JBoss VFS i Apache VFS mają identyczne nazwy, ale są różnymi produktami. Korzystanie z klas Apache VFS prawdopodobnie nie pomoże w problemach z VB JBoss. Również korzystanie z dokumentacji Apache VFS raczej nie pomoże. A JBoss nie dokumentował ich VFS bardzo dobrze, więc większość dokumentacji, którą znajdziesz, dotyczy Apache. – skiphoppy

Odpowiedz

4

Odkryłem, że metoda getContent() dostarczy mi plik VirtualFile, którego być może będę mógł użyć. Nadal nie wyjaśnia, dlaczego nie mogę po prostu zrobić openStream() na vfs:/URL.

import org.jboss.vfs.*; 

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

Poprzednia odpowiedź nadal daje strumień, z którego nie można odczytać.

Znalazłem, że mogę uzyskać fizyczny plik, do którego odnosi się plik VirtualFile, ale zwracany wynik odnosi się do katalogu o nazwie contents /, w katalogu zawierającym rzeczywisty plik, którego szukam. A więc:

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); 

Co za bałagan. Nadal nie rozumiem mojego pierwotnego pytania, dlatego JBoss podał mi adres URL, z którego nie można odczytać? Ale przynajmniej mogę odejść, na razie.