【问题标题】:Trouble using PathMatchingResourcePatternResolver to get src/main/resources in WAR file使用 PathMatchingResourcePatternResolver 获取 WAR 文件中的 src/main/resources 时遇到问题
【发布时间】:2021-07-08 23:48:00
【问题描述】:

我正在使用 Spring 的 PathMatchingResourcePatternResolver 来尝试获取当前位于我的 src/main/resources 目录中的 .jmx 文件(JMeter 测试)列表。这将作为 WAR 文件托管在 AWS 上。

当我在本地工作时,我有这个代码块给我资源/目录中的 .jmx 文件列表,但我知道不能使用我的本地文件路径:

PathMatchingResourcePatternResolver resolver =
                   new PathMatchingResourcePatternResolver(MyClass.class.getClassLoader());
Resource[] resources = resolver.getResources("file:/C:/Users/user.name/repos/my-repo/src/main/resources/dailyTests/*.jmx")

我一直在尝试使用类路径*:这实际上几乎可以工作:

Resource[] resources = resolver.getResources("classpath*:*.jmx");

这将获取我所有的 .jmx 文件,其 URL 如下所示:

file:/C:/Users/user.name/repos/my-repo/target/classes/my_jmeter_test.jmx

但我还需要能够处理资源目录的子目录。当我尝试更具体时,我相信我输入了不正确的模式。据我了解,在使用 classpath* 时,您仍然需要在 classpath*: 之后使用根目录,但我不确定应该是什么。

到目前为止我已经尝试过

Resource[] resources = resolver.getResources("classpath*:Users/*.jmx");
Resource[] resources = resolver.getResources("classpath*:classes/*.jmx");
Resource[] resources = resolver.getResources("classpath*:WEB-INF/*.jmx");
Resource[] resources = resolver.getResources("classpath*:com/*.jmx");

还有许多其他的猜测,所有这些都返回了 0 个资源。似乎当我更具体一步时,我得到了 0 个资源。

我想我可能误解了我应该如何浏览 WAR 文件,或者可能只是误解了 classpath* 得到的内容。我完全不在这儿了吗?

【问题讨论】:

    标签: java spring spring-boot war


    【解决方案1】:

    事实证明,当我使用 Maven 时,我对 src/main/resources 在 WAR 文件中的最终位置缺乏了解。 src/main/resources 中的所有文件都将被复制到 WAR 文件的根目录中。 (在选定的answer here中注明)。

    当使用 Spring 的 PathMatchingResourcePatternResolver 时,classpath* 获得了 WAR 的根,所以这就是我使用这个获取 .jmx 文件的原因:

     Resource[] resources = resolver.getResources("classpath*:*.jmx");
    

    从那里,如果我的项目需要嵌套目录中的更多文件,例如 src/main/resources/specialTest。我可以使用:

    Resource[] resources = resolver.getResources("classpath*:specialTest/*.jmx");
    

    根据文档,我不确定的一件事:

    警告:请注意,“classpath*:”与 Ant 样式模式结合使用时 只能在至少一个根目录下可靠地工作 模式开始,除非实际的目标文件驻留在文件中 系统。这意味着像 "classpath*:*.xml" 这样的模式不会 从 jar 文件的根目录中检索文件,而不是仅从 扩展目录的根目录。

    我认为这意味着我将无法从 WAR 文件的根目录获取文件,但这正是我正在做的事情。目前看来,当我使用“classpath*:*.jmx”时,我只从根目录获取 .jmx 文件,如果我想要更深入的内容,我必须添加一个根目录来启动模式。如果我完全弄清楚这是否正确,我会尝试更新。

    【讨论】:

      猜你喜欢
      • 2015-02-26
      • 2015-03-22
      • 2014-04-01
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      相关资源
      最近更新 更多