java—当SpringBootJAR驻留在带有空格的路径中时,资源位于两个位置

mbzjlibv  于 2021-07-08  发布在  Java
关注(0)|答案(0)|浏览(151)

在将一些“遗留”代码转移到spring引导应用程序中时,我注意到部署“fatjar”版本的代码时出现了异常行为,与通配符类路径扫描有关。
遗留代码使用dozerMap,由xml配置,Map配置分布在多个包中(它们与所Map的类保持接近)。为了定位这些,我们使用了一个工厂bean,它使用非常允许的通配符类路径扫描:

@Bean
public DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean(
    @Value("classpath*:**/*_dozer_mapping.xml") Resource[] resources) { ... }

这可以工作,并找到所有必需的配置文件。spring引导应用程序使用 spring-boot-maven-plugin .
一切正常,直到runnable jar被放置在路径中有空格的位置(在windows中)(例如在windows中) C:\Program Files\MySoftware\myApplication.jar ). 发生这种情况时,传递到上述bean方法中的参数两次包含一些已定位的配置文件(dozer不喜欢)。
在spring框架中进行调试表明,这个问题存在于 PathMatchingResourcePatternResolver::findPathMatchingResources . 问题代码是:

String rootDirPath = determineRootDir(locationPattern);
String subPattern = locationPattern.substring(rootDirPath.length());
Resource[] rootDirResources = getResources(rootDirPath);

如果安装到路径中有空格的文件夹中,则 getResources call返回一个额外的url资源,例如:

URL [jar:file:C:\Program Files\MySoftware\myApplication.jar!/]

结果,该jar中的配置文件被检测两次,并传递给(在本例中)服务器 dozerBeanMapperFactoryBean (这会导致重复定义的问题)。
作为一个简单的测试,创建一个spring引导应用程序,如下所示:

@SpringBootApplication
public class TestApp {
  private Resource[] resources;
  public static void main(String[] args) {
    SpringApplication.run(TestApp.class, args);
  }

  public TestApp(@Value("classpath*:**/*.xml") Resource[] resources) {
    this.resources = resources;
  }
}

将xml文件添加到资源文件夹中。使用编译为单个jar spring-boot-maven-plugin<goal>repackage</goal> . 当作为位于带有空格的路径中的jar运行时,xml文件会被定位两次。
有什么我们错过的吗?我不希望宽通配符会导致这种行为。
我们用的是Spring Boot 2.3.1.RELEASE 在这种情况下。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题