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

时间:2016-04-29 14:06:25

标签: spring spring-boot spring-properties

有没有办法可以使用Spring启动应用程序中的application.properties文件中的相对路径查找文件资源,如下所示

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

3 个答案:

答案 0 :(得分:6)

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

我发现下面的代码有效:

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

答案 1 :(得分:5)

@membersound答案只是将硬编码路径分为两部分,而不是动态解析属性。我可以告诉您如何实现您正在寻找的内容,但是您需要了解的是,当您将应用程序作为jar运行时, NO 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,因此您只需在context.initializer.classes=com.example.MyApplicationContextInitializer中声明application.properties,Boot就会在启动时运行此类。

提醒

  1. 这在本地工作空间之外不起作用,因为它取决于源代码结构。

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

  3. 如果MyApplicationContextInitializer位于src/test/javapwd将是<projectBasedir>/build/classes/test/,而不是<projectBasedir>/build/classes/main/

答案 2 :(得分: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()