有沒有辦法用在春季啓動應用程序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