有没有办法用在春季启动应用程序application.properties文件相对路径下面指定在application.properties相对路径春
spring.datasource.url=jdbc:hsqldb:file:${project.basedir}/db/init
有没有办法用在春季启动应用程序application.properties文件相对路径下面指定在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的方式运行应用程序时,有NOproject.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);
}
}}
看起来你正在使用启动,所以你可以声明context.initializer.classes=com.example.MyApplicationContextInitializer
在application.properties
和引导将在启动时运行这个类。再次注意的
词:
这不会在本地工作区外的工作,因为它依赖于源代码结构。
我假设这里有一个Gradle项目结构/build/classes/main
。如有必要,根据您的构建工具进行调整。
如果MyApplicationContextInitializer
是在src/test/java
,pwd
将<projectBasedir>/build/classes/test/
,不<projectBasedir>/build/classes/main/
。
我正在使用spring boot来构建上传示例,并遇到同样的问题,我只想获取项目根路径。 (例如:/ SRING启动上传)
我发现,下面的代码工作:
upload.dir.location=${user.dir}\\uploadFolder
没有$ {} project.basedir Spring容器内工作 –
接收'java.lang.IllegalArgumentException异常:难道 不解决占位符'basedir'字符串值“jdbc:hsqldb:file:$ {basedir}/db/init” –
所以你有一个变量声明之前命名'basedir = ...'?比它应该工作。当然它必须在重用placehodler之前声明。 – membersound