【问题标题】:Spring ResourceLoader doesn't find resources in JARSpring ResourceLoader 在 JAR 中找不到资源
【发布时间】:2014-02-02 14:55:28
【问题描述】:

我正在寻找基于 Spring 配置的层次结构。最简单的形式是几个“核心”库和几个能够覆盖“核心”库中的 bean 的“自定义”项目。

当通过 Maven 运行非常简单的单元测试时,无法找到“核心”配置导致测试失败。

final Resource[] resources = applicatonContext.getResources("classpath*:core-*spring.xml");

什么都不返回。它无法找到位于我的自定义项目核心依赖项中的预期 core-one-spring.xmlcore-two-spring.xml

查看类路径上的 JAR 不是 Spring 的默认行为吗?或者我有什么特别的事情要做?

当我在我的 IDE (IntelliJ) 中运行时,测试完美通过,因为整个项目已加载,它们只是 Spring 可以找到的文件。

更新

如果我在没有通配符的情况下明确添加文件,Spring 能够找到这些文件。

@ContextConfiguration({"classpath:core-one-spring.xml", "classpath:core-two-spring.xml", "classpath:custom-spring.xml", "classpath:test-spring.xml"})

final Resource[] resources = custom.getResources("classpath:core-one-spring.xml");

【问题讨论】:

  • 我不相信它可以在名称中间使用通配符。我认为* 只能与classpath 前缀一起使用。
  • 前缀与在名称中使用通配符无关。前缀与加载的文件数量有关。前缀 classpath 加载单个(第一个找到的)资源,前缀 classpath* 将尝试加载与模式匹配的所有资源。
  • 我不是这个意思,但我还是错了。您确定您的 JUnit 测试配置将所有库都放在类路径中吗?
  • 我很确定是这样,但是在 JUnit 测试期间如何检查类路径?
  • 以简单的@Test 方法尝试these 之一。

标签: java spring


【解决方案1】:

来自manual

请注意,当与 Ant 样式模式结合使用时,“classpath*:”只能在模式开始前至少在一个根目录下可靠地工作,除非实际的目标文件驻留在文件系统中。这意味着像“classpath*:*.xml”这样的模式不会从 jar 文件的根目录中检索文件,而只会从扩展目录的根目录中检索文件。这源于 JDK 的 ClassLoader.getResources() 方法的限制,该方法仅返回传入空字符串的文件系统位置(指示要搜索的潜在根)。

【讨论】:

  • 是的,我知道这一点。对于我的测试示例,它们都在根目录中。对于生产,他们将在更好的地方。这不会影响我的示例。
  • 在重读了几次之后(不知道为什么我错过了它..也许我感冒了)我把所有东西都放在了“至少一个根目录”中,但它仍然不起作用。跨度>
  • 谢谢,这阻止了我扯头发。
猜你喜欢
  • 2014-02-15
  • 2021-01-01
  • 2014-03-22
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2014-11-28
相关资源
最近更新 更多