Som*_*kar 12 spring spring-boot spring-properties
有没有办法我们可以使用Spring启动应用程序中的application.properties文件中的相对路径查找文件资源,如下所述
spring.datasource.url=jdbc:hsqldb:file:${project.basedir}/db/init
Run Code Online (Sandbox Code Playgroud)
@membersound答案只是将硬编码路径分为两部分,而不是动态解析属性。我可以告诉你如何实现你要找的东西,但你要明白的是,有NO 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);
}
}}
Run Code Online (Sandbox Code Playgroud)
看起来您正在使用Boot,因此您只需context.initializer.classes=com.example.MyApplicationContextInitializer
在中声明application.properties
,Boot就会在启动时运行此类。
再次警告:
这将无法在本地工作空间之外进行,因为它取决于源代码结构。
我在这里假设了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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16411 次 |
最近记录: |