12

アプリケーションをJBoss4からJBoss6にアップグレードしています。

アプリケーションのいくつかの部分が通常とは異なる方法でクライアントに配信されます。jarはアプリケーション内で検索され、サーブレットからクライアントに送信されます。ここで、クライアントは特定のサポート機能を実行するためにそれらを抽出します。

JBoss 4では、これらのjarをクラスローダーで検索し、jarを読み取ってその内容をクライアントに送信するために使用されるjar://URLを見つけます。

JBoss 6では、ルックアップを実行すると、vfs:/URLを取得します。これはorg.jboss.vfsパッケージからのものであることを理解しています。残念ながら、このURLでopenStream()を呼び出してストリームから読み取ると、すぐにEOFが取得されます(read()は-1を返します)。

何が得られますか?このURLが参照しているリソースを読み取れないのはなぜですか?

基盤となるVFSパッケージにアクセスしてJBossVFSAPIを介してファイルを開こうとしましたが、ほとんどのAPIがプライベートであるように見え、vfs:/URLからVFSに変換するルーチンが見つかりませんでした。 VirtualFileオブジェクトなので、どこにもアクセスできませんでした。

JBoss内のディスクでファイルを見つけようと試みることはできますが、そのアプローチはアップグレード時に非常に失敗しやすいように聞こえます。

以前のアプローチでは、Java Web Startを使用してjarをクライアントに配布し、JavaWebStartのキャッシュ内でそれらを検索して抽出していました。しかし、キャッシュのレイアウトが変更されたため、Javaのマイナーアップグレードごとに問題が発生しました。

4

5 に答える 5

9

前の回答でも、読み取ることができないストリームが生成されます。

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が渡されるのはなぜですか。しかし、少なくとも今のところ、先に進むことができます。

于 2011-02-04T16:33:00.893 に答える
4

問題JBVFS-147vfsから読み取れません:プロトコルURLはまだ解決されていません。投票して、この問題を監視することをお勧めします。

于 2011-02-04T18:56:51.547 に答える
4

getContent()メソッドがVirtualFileを提供することを発見しました。これは、おそらく使用できます。vfs:/ URLでopenStream()を実行できない理由はまだ説明されていません。

import org.jboss.vfs.*;

URLConnection conn = new URL("vfs:/...").openConnection();
VirtualFile vf = (VirtualFile)conn.getContent();
InputStream is = vf.openStream();
于 2011-02-04T15:25:39.510 に答える
0

仮想ファイルに対するそのgetContent()アプローチも機能しません。リフレクションを使用してテストし、サーブレットではおそらく不要なJBoss/Wildflyへの依存を回避しました。

// Reflection as we cannot afford a dependency to WildFly11
Object virtualFile = url.openConnection().getContent();
Class virtualFileClass = virtualFile.getClass();
DevModeInitializer.log(virtualFileClass.getCanonicalName());
Method openStreamMethod = virtualFileClass.getMethod("openStream");
InputStream inputStream = (InputStream) openStreamMethod.invoke(virtualFile);

そのストリームから読み取ると、「-1」のみが生成されます。つまり、空です。

于 2019-09-11T18:23:19.137 に答える
0

WildFly11での動作を調査しました。

特に、電話するだけ

getPhysicalFile();

実際に物理ファイルを作成するという副作用があり、それだけが読み取れるように見えます。仮想ディレクトリにすべてのファイルを作成するために、私は次のことを行いました。

      // Reflection as we cannot afford a dependency to WildFly11
      Object virtualFile = url.openConnection().getContent();
      Class virtualFileClass = virtualFile.getClass();         

      Method getChildrenRecursivelyMethod = virtualFileClass.getMethod("getChildrenRecursively");
      Method getPhysicalFileMethod = virtualFileClass.getMethod("getPhysicalFile");

      List virtualFiles = (List) getChildrenRecursivelyMethod.invoke(virtualFile);
      for (Object child : virtualFiles){
        File physical = (File) getPhysicalFileMethod.invoke(child); // side effect: create real-world files
      }
      File rootDir = (File) getPhysicalFileMethod.invoke(virtualFile);

これで、物理的な世界でルートディレクトリを一覧表示し、そのファイルにアクセスできます。

于 2019-09-11T19:09:12.033 に答える