在 Spring 中指定 application.properties 中的相对路径
Specifying relative path in application.properties in Spring
有没有一种方法可以在 Spring 引导应用程序中使用 application.properties 文件中的相对路径查找文件资源,如下所述
spring.datasource.url=jdbc:hsqldb:file:${project.basedir}/db/init
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()
@membersound 的回答只是将硬编码路径分成两部分,而不是动态解析 属性。我可以告诉你如何实现你正在寻找的东西,但你需要了解的是,当你 运行 宁作为 jar 或 war 的应用程序。在本地工作空间之外,源代码结构不存在。
如果你仍然想这样做来测试,那是可行的,你需要的是操作 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,因此您只需在 application.properties
中声明 context.initializer.classes=com.example.MyApplicationContextInitializer
,Boot 将在启动时 运行 这个 class。
再次提醒:
这在本地工作区之外不起作用,因为它取决于源代码结构。
我在这里假设了一个 Gradle 项目结构 /build/classes/main
。如有必要,根据您的构建工具进行调整。
如果 MyApplicationContextInitializer
在 src/test/java
中,pwd
将是 <projectBasedir>/build/classes/test/
,而不是 <projectBasedir>/build/classes/main/
。
我正在使用spring boot构建上传示例,遇到同样的问题,我只想获取项目根路径。 (例如 /sring-boot-upload)
我发现下面的代码有效:
upload.dir.location=${user.dir}\uploadFolder
有没有一种方法可以在 Spring 引导应用程序中使用 application.properties 文件中的相对路径查找文件资源,如下所述
spring.datasource.url=jdbc:hsqldb:file:${project.basedir}/db/init
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()
@membersound 的回答只是将硬编码路径分成两部分,而不是动态解析 属性。我可以告诉你如何实现你正在寻找的东西,但你需要了解的是,当你 运行 宁作为 jar 或 war 的应用程序。在本地工作空间之外,源代码结构不存在。
如果你仍然想这样做来测试,那是可行的,你需要的是操作 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,因此您只需在 application.properties
中声明 context.initializer.classes=com.example.MyApplicationContextInitializer
,Boot 将在启动时 运行 这个 class。
再次提醒:
这在本地工作区之外不起作用,因为它取决于源代码结构。
我在这里假设了一个 Gradle 项目结构
/build/classes/main
。如有必要,根据您的构建工具进行调整。如果
MyApplicationContextInitializer
在src/test/java
中,pwd
将是<projectBasedir>/build/classes/test/
,而不是<projectBasedir>/build/classes/main/
。
我正在使用spring boot构建上传示例,遇到同样的问题,我只想获取项目根路径。 (例如 /sring-boot-upload)
我发现下面的代码有效:
upload.dir.location=${user.dir}\uploadFolder