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

标签 java url jboss vfs

我们正在将我们的应用程序从 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/

相关文章:

java - 在 Wildfly 中使用多个数据源

java - 有条件地订阅 rxJava2 Observable

java - 额外的脚本层是如何实现的?

java - Android 上的谷歌 oauth2

android - 如何在android浏览器上打开嵌入在url中的音频和视频

web-services - 使用 Jboss 4.2.3ga 没有命名空间前缀的 JAXWS 问题

java - 如何在 Dialog 和 Activity 之间传递值?

Django:从URL分发程序传递数据以查看而不将数据包含在URL中?

java - 创建一个包含 '&' 的 url

java - JBoss 在 Debug模式下速度极慢