2016-04-29 88 views

回答

0
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() 
+0

沒有$ {} project.basedir Spring容器內工作 –

+0

接收'java.lang.IllegalArgumentException異常:難道 不解決佔位符'basedir'字符串值「jdbc:hsqldb:file:$ {basedir}/db/init」 –

+0

所以你有一個變量聲明之前命名'basedir = ...'?比它應該工作。當然它必須在重用placehodler之前聲明。 – membersound

1

@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.MyApplicationContextInitializerapplication.properties和引導將在啓動時運行這個類。再次注意的

詞:

  1. 這不會在本地工作區外的工作,因爲它依賴於源代碼結構。

  2. 我假設這裏有一個Gradle項目結構/build/classes/main。如有必要,根據您的構建工具進行調整。

  3. 如果MyApplicationContextInitializer是在src/test/javapwd<projectBasedir>/build/classes/test/,不<projectBasedir>/build/classes/main/

0

我正在使用spring boot來構建上傳示例,並遇到同樣的問題,我只想獲取項目根路徑。 (例如:/ SRING啓動上傳)

我發現,下面的代碼工作:

upload.dir.location=${user.dir}\\uploadFolder