在Spring Boot应用程序的application.properties文件中,有没有一种方法可以使用相对路径查找文件资源,如下所示:
spring.datasource.url=jdbc:hsqldb:file:${project.basedir}/db/init
在Spring Boot应用程序的application.properties文件中,有没有一种方法可以使用相对路径查找文件资源,如下所示:
spring.datasource.url=jdbc:hsqldb:file:${project.basedir}/db/init
我正在使用Spring Boot构建上传示例,并遇到了同样的问题,我只想获取项目根路径(例如,/spring-boot-upload)。
我发现以下代码可行:
upload.dir.location=${user.dir}\\uploadFolder
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将在启动时运行此类。
再次提醒:
由于它依赖于源代码结构,因此此方法仅适用于本地工作区。
这里假设了一个Gradle项目结构 /build/classes/main
,如果需要,请根据您的构建工具进行调整。
如果MyApplicationContextInitializer
在src/test/java
中,则pwd
将是<projectBasedir>/build/classes/test/
,而不是<projectBasedir>/build/classes/main/
。
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()
java.lang.IllegalArgumentException: Could not resolve placeholder 'basedir' in string value "jdbc:hsqldb:file:${basedir}/db/init"
。 - Somasundaram Sekarbasedir=...
之前未声明的变量?那么它应该可以工作。当然,在重用占位符之前必须先声明它。 - membersound