【问题标题】:Specifying relative path in application.properties in Spring在 Spring 的 application.properties 中指定相对路径
【发布时间】:2016-04-29 14:06:25
【问题描述】:

有没有一种方法可以使用 Spring Boot 应用程序中的 application.properties 文件中的相对路径来查找文件资源,如下所示

spring.datasource.url=jdbc:hsqldb:file:${project.basedir}/db/init

【问题讨论】:

    标签: spring spring-boot spring-properties


    【解决方案1】:

    我正在使用spring boot构建一个上传示例,并且遇到同样的问题,我只想获取项目根路径。 (例如 /sring-boot-upload)

    我发现下面的代码有效:

    upload.dir.location=${user.dir}\\uploadFolder
    

    【讨论】:

    • 谁说上传文件夹会在主目录下?
    • @AbhijitSarkar 我们对此有标准吗?
    • 任何资源都应该是项目的一部分
    【解决方案2】:

    @membersound 答案只是将硬编码路径分成两部分,而不是动态解析属性。我可以告诉你如何实现你正在寻找的东西,但你需要了解的是,当你将应用程序作为 jar 或 war 运行时,NO project.basedir 是存在的。在本地工作空间之外,源代码结构不存在。

    如果您仍然想这样做进行测试,那是可行的,您需要操作PropertySources。您最简单的选择如下:

    定义一个ApplicationContextInitializer,并在那里设置属性。类似于以下内容:

        public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        @Override
        public void initialize(ConfigurableApplicationContext appCtx) {
            try {
                // should be /<path-to-projectBasedir>/build/classes/main/
                File pwd = new File(getClass().getResource("/").toURI());
                String projectDir = pwd.getParentFile().getParentFile().getParent();
                String conf = new File(projectDir, "db/init").getAbsolutePath();
                Map<String, Object> props = new HashMap<>();
                props.put("spring.datasource.url", conf);
                MapPropertySource mapPropertySource = new MapPropertySource("db-props", props);
                appCtx.getEnvironment().getPropertySources().addFirst(mapPropertySource);
            } catch (URISyntaxException e) {
                throw new RuntimeException(e);
            }
        }}
    

    看起来您正在使用 Boot,因此您只需在 application.properties 中声明 context.initializer.classes=com.example.MyApplicationContextInitializer,Boot 就会在启动时运行此类。

    请注意

    1. 这将无法在本地工作区之外工作,因为它取决于源代码结构。

    2. 我在这里假设了一个 Gradle 项目结构 /build/classes/main。如有必要,根据您的构建工具进行调整。

    3. 如果MyApplicationContextInitializersrc/test/java 中,则pwd 将是&lt;projectBasedir&gt;/build/classes/test/,而不是&lt;projectBasedir&gt;/build/classes/main/

    【讨论】:

      【解决方案3】:
      your.basedir=${project.basedir}/db/init
      spring.datasource.url=jdbc:hsqldb:file:${your.basedir}
      
      @Value("${your.basedir}")
      private String file;
      
      new ClassPathResource(file).getURI().toString()
      

      【讨论】:

      • ${project.basedir} 在 Spring 容器中是否工作
      • 接收java.lang.IllegalArgumentException: Could not resolve placeholder 'basedir' in string value "jdbc:hsqldb:file:${basedir}/db/init"
      • 所以你在声明之前有一个名为basedir=...的变量?比它应该工作。当然必须在重用占位符之前声明它。
      • 这只是将硬编码路径分成两部分。 OP 正在寻找的是 Boot 可以解析的属性,而不是用户配置的属性。
      猜你喜欢
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2012-07-05
      • 1970-01-01
      相关资源
      最近更新 更多