在Spring的application.properties中指定相对路径

20

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

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

15

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

我发现以下代码可行:

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

1
谁说上传文件夹会在主目录下? - Abhijit Sarkar
@AbhijitSarkar,我们有一个标准吗? - chendu
任何资源都应该是项目的一部分。 - Abhijit Sarkar

8
@membersound的回答只是将硬编码路径分成两部分,而不是动态解析属性。我可以告诉你如何实现你想要的,但你需要明白的是,当你以jar或war形式运行应用程序时,没有project.basedir。在本地工作区之外,源代码结构不存在。
如果你仍然想为测试做这件事,那是可行的,你需要操作PropertySource。你最简单的选择如下:
定义一个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将是<projectBasedir>/build/classes/test/,而不是<projectBasedir>/build/classes/main/


0
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()

在Spring容器中,${project.basedir}是否有效? - Somasundaram Sekar
收到 java.lang.IllegalArgumentException: Could not resolve placeholder 'basedir' in string value "jdbc:hsqldb:file:${basedir}/db/init" - Somasundaram Sekar
所以你有一个名为 basedir=... 之前未声明的变量?那么它应该可以工作。当然,在重用占位符之前必须先声明它。 - membersound
2
这只是将硬编码路径分成两部分。OP正在寻找的是Boot可以解析的属性,而不是用户配置的属性。 - Abhijit Sarkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接