为什么我不能打开JBoss vfs:/ URL?

我们正在将我们的应用程序从JBoss 4升级到JBoss 6。

我们的应用程序的几个部分以一种不寻常的方式传递给客户端:在应用程序内部查找jar并从servlet发送到客户端,客户端在其中提取它们以运行某些支持function。

在JBoss 4中,我们将使用类加载器查看这些jar子,并找到一个jar:// URL,用于读取jar并将其内容发送到客户端。

在JBoss 6中,当我们执行查找时,我们得到一个vfs:/ URL。 我知道这是来自org.jboss.vfs包。 不幸的是,当我在这个URL上调用openStream()并从流中读取时,我立即得到一个EOF(read()返回-1)。

是什么赋予了? 为什么我不能读取此URL引用的资源?

我试过通过JBoss VFS API尝试访问底层VFS包来打开文件,但是大多数API似乎是私有的,我找不到从vfs:/ URL转换为VFS的例程VirtualFile对象,所以我无法到达任何地方。

我可以尝试在JBoss中找到磁盘上的文件,但这种方法在升级时听起来非常容易出错。

我们的旧方法是使用Java Web Start将jar分发到客户端,然后在Java Web Start的缓存中查找它们以提取它们。 但是,由于缓存的布局发生了变化,因此Java的每次小升级都会破坏。

JBVFS-147无法从vfs:协议URL读取的问题仍未解决,可能您想投票并观看此问题。

以前的答案仍会产生无法读取的流。

我发现我可以获得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? 但至少我现在可以继续前进。

我发现getContent()方法会给我一个VirtualFile,也许我可以使用它。 仍然没有解释为什么我不能在vfs:/ URL上执行openStream()。

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