Java Spring引导,从application.yaml读取的路径类型属性

Java Spring引导,从application.yaml读取的路径类型属性,java,spring,spring-boot,spring-properties,Java,Spring,Spring Boot,Spring Properties,我希望有人能够帮助我解决我在SpringBootVersion2.3.5中发现的以下问题 我有一个简单的测试应用程序(无法共享源),其中: 我有一个用@ConfigurationProperties(prefix=“app”)注释的类和一个字段私有路径 application.yaml文件已配置值path:C:\\Local 在应用程序启动期间,应将application.yaml中配置的属性值打印到控制台。 因此,我有以下行为: 当我从IntelliJ(Windows机器)运行应用程序时

我希望有人能够帮助我解决我在SpringBootVersion2.3.5中发现的以下问题

我有一个简单的测试应用程序(无法共享源),其中:

  • 我有一个用
    @ConfigurationProperties(prefix=“app”)
    注释的类和一个字段
    私有路径
  • application.yaml
    文件已配置值
    path:C:\\Local
在应用程序启动期间,应将
application.yaml
中配置的属性值打印到控制台。 因此,我有以下行为:

  • 当我从IntelliJ(Windows机器)运行应用程序时,它运行正常
  • 当我构建胖jar(使用Maven-Spring引导插件)并运行应用程序时,它失败了
  • 当同一个jar在Linux下运行时,配置了Linux路径后,它工作正常
你知道为什么吗?或者参考与该主题相关的文档

编辑 发生属性打印的类:

@SpringBootApplication
public class ApplicationBootstrap implements ApplicationRunner {

    @Autowired private ApplicationProperties properties;

    @Override public void run(final ApplicationArguments args) {
        System.out.println(properties.getPath());
    }

    public static void main(String[] args) {
        SpringApplication.run(ApplicationBootstrap.class);
    }
}
更新 看来问题出在类路径加载器中

该问题出现在第100行的
org.springframework.beans.propertyeditors.PathEditor

else if (!resource.exists() && nioPathCandidate)
在IntellJ下运行时,使用
ClassLoaders$AppClassLoader
,这个可以解析值
C:\\Local

从jar运行时,使用
launchDurlClassLoader
,当使用相同的值执行第100行时失败,异常消息
java.lang.IllegalArgumentException:name

因此,最有可能的问题是在Spring引导类加载程序中

更新

问题出现在
LaunchedURLClassLoader
的方法
findResource()
中,该方法将相同的方法委托给
URLClassLoader
,而
AppClassLoader
(从IntellJ运行时使用)将相同的方法委托给
buildinclassloader

最终答案 问题是,在某一点上,它将
c:
视为协议,并出现异常而失败

因此,属性文件中的正确配置应该是:
app.path=file:C:\\Local

相关问题:


谢谢。

首先,您的申请文件扩展名应为“yml”。 你能提供你的申请表吗? 以下示例适用于我:

@Component
@ConfigurationProperties(prefix = "app")
public class TestConfig {
  private Path path;

  public Path getPath() {
    return path;
  }

  public void setPath(Path path) {
    this.path = path;
  }
}
和应用

app:
  path: C:\FOO\BAR

IDEA是否使用与从CLI启动FatJar时相同的系统范围JRE,或者它们不同?是相同的JDKThank for“.yaml”,这是一个错误,我修复了它,但仍然遇到相同的问题。properties类看起来与您的类相同,并且
application.yml
也一样。您可以提供您尝试在控制台中打印值的类吗?更新了该类的问题。是否在ApplicationProperties类中使用以下导入:import java.nio.file.Path?您使用的是什么版本的Java?
app:
  path: C:\FOO\BAR