我们正在将我们的应用程序从 JBoss 4 升级到 JBoss 6。
我们的应用程序的几个部分以一种不寻常的方式交付给客户端:在我们的应用程序内部查找 jars 并从 servlet 发送给客户端,客户端在其中提取它们以运行某些支持功能。
在 JBoss 4 中,我们将使用类加载器查找这些 jar,并找到一个 jar://URL,该 URL 将用于读取 jar 并将其内容发送到客户端。
在 JBoss 6 中,当我们执行查找时,我们得到一个 vfs:/URL。我知道这是来自 org.jboss.vfs 包。不幸的是,当我在此 URL 上调用 openStream() 并从流中读取时,我立即得到一个 EOF(read() 返回 -1)。
什么给了?为什么我无法读取此 URL 引用的资源?
我尝试访问底层 VFS 包以通过 JBoss VFS API 打开文件,但大多数 API 似乎是私有(private)的,我找不到从 vfs:/URL 转换的例程到 VFS VirtualFile 对象,所以我无法到达任何地方。
我可以尝试在 JBoss 中的磁盘上找到该文件,但这种方法在升级时听起来很容易失败。
我们的旧方法是使用 Java Web Start 将 jar 分发到客户端,然后在 Java Web Start 的缓存中查找它们以提取它们。但这在 Java 的每次小升级时都会中断,因为缓存的布局发生了变化。
最佳答案
以前的答案仍然会产生无法读取的流。
我发现我可以获得 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?但至少我现在可以继续前进。
关于java - 为什么我不能打开 JBoss vfs :/URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4899371/