【问题标题】:Using the ClassLoader method to retrieve all resources under classes as Input Streams使用 ClassLoader 方法检索类下的所有资源作为输入流
【发布时间】:2010-10-28 21:11:48
【问题描述】:

我的问题是一个你认为很常见的问题,但到目前为止我还没有找到解决方案。

在 Tomcat 5.5 下构建 Java Web 应用程序(尽管要求它可以部署在任何地方,例如在 WebLogic 环境下,因此需要将资源作为流加载)。良好的实践要求资源文件放在 WEB-INF/classes 下并使用 ClassLoader 的 getResourceAsStream() 方法加载。当您知道要加载的资源的名称时,一切都很好。

我的问题是我需要加载位于 classes 子目录中的所有内容(包括递归地加载到非空子目录中)。

所以,例如,如果我在 WEB-INF/classes 下有以下内容:

文件夹X/文件夹Y

folderX/folderY/fileA.properties

folderX/fileB.properties

我需要加载 fileA.properties 和 fileB.properties 类,但实际上在应用程序启动之前并不知道它们的名称(即我需要能够从 WEB-INF/classes 下的任何目录中任意加载资源)。​​

最优雅的方法是什么?我可以查询什么对象来找到我需要的信息(每个所需资源的资源路径)?最好使用非 servlet 特定的解决方案(如果可能,将其全部保存在类加载框架中)。

提前致谢!

【问题讨论】:

    标签: java classloader


    【解决方案1】:

    据我所知,没有这样的能力,因为类加载器只尝试加载它被要求的东西。它不会预取类路径上的所有项目,也不会将它们视为目录结构。

    我解决问题的方法是在构建时在所有相关资源的文本文件中创建一个目录列表,并将其包含在战争中,然后通过这种方式进行。

    【讨论】:

      【解决方案2】:

      你可以通过一些技巧来做到这一点:)

      获取资源作为 URL,提取协议:

      • 文件协议 - 获取 URL 路径和你有一个文件夹,扫描文件。
      • jar/zip 协议 - 提取 jar/zip 路径并使用 JarFile 浏览文件并提取路径/包下的所有内容。

      【讨论】:

      • Web 服务器不能返回指向自身的 http 协议吗?我会说至少应该在所有目标 Web 服务器上测试这种方法,以确保它有效。
      • Sun Jersey REST 实现使用这种方法根据包名搜索特定类(查找具有特定注释的类)。
      • WebLogic 在未爆炸 WAR 部署方面的限制如何?实例化和询问 File 对象的任何尝试不会在 WebLogic 下导致问题吗?
      • 不,绝对不是。使用 File 或 ZipFile 对象不会影响容器,无论您使用哪一个。
      • 文件协议可能有效。提取 jar/zip 将递归地包含整个应用程序 .war 和/或 .ear 档案。这似乎不仅仅是棘手的!如果有人能很好地解决这个问题,那么他们应该做一个不错的开源项目!
      猜你喜欢
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 2017-10-04
      • 1970-01-01
      • 2017-05-26
      相关资源
      最近更新 更多