2016-04-29 84 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