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

新手上路,请多包涵

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

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

原文由 Somasundaram Sekar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3k
2 个回答

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

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

定义一个 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. If MyApplicationContextInitializer is in the src/test/java , pwd will be <projectBasedir>/build/classes/test/ , not <projectBasedir>/build/classes/main/ .

原文由 Abhijit Sarkar 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

我发现下面的代码有效:

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

原文由 chendu 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题