3

我通过将 WarLauncher(spring boot loader 的一部分)指定为我的启动类来创建一个可执行的 war 文件。当所有配置文件(属性、弹簧上下文等)都是我的资源文件夹的一部分时,它工作正常。我希望我的战争消费者需要控制属性文件。因此它需要在war文件之外加载。我期待配置文件夹中的属性文件(与war文件并排部署)。我试图通过使用 maven 插件将适当的类路径条目添加到清单中,但它没有奏效。

以下是我的 maven POM 文件的相关部分的样子:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-war-plugin</artifactId>
   <version>2.3</version>
   <configuration>
      <archive>
         <manifest>
            <addClasspath>true</addClasspath>
            <mainClass>org.springframework.boot.loader.WarLauncher</mainClass>
         </manifest>
         <manifestEntries>
            <Start-Class><<myclass_dont_worry_about_this>></Start-Class>
            <Class-Path>config/</Class-Path>
         </manifestEntries>
      </archive>
      <failOnMissingWebXml>false</failOnMissingWebXml>
   </configuration>
</plugin>

我正在使用 Spring ClassPathResource() 来加载属性文件。下面显示了相同的代码片段:

 InputStream stream = new ClassPathResource(classPathConfigFilePath).getInputStream();
 Proerties properties = new Properties();
 properties.load(stream);

在运行时,它无法找到导致 FileNotFoundException 的属性文件。

谢谢。

4

1 回答 1

5

Spring-Boot 默认在以下位置搜索application.properties文件

  1. 类路径根
  2. 当前目录
  3. 类路径/config
  4. /config当前目录的子目录

所有这些文件(如果可用)按该顺序加载,这意味着 1 中的属性可以被 2、3、4 覆盖。所有加载的属性都可以作为 的一部分Environment使用,因此可以在占位符中使用以进行配置。

作为上述加载规则的补充,还可以加载配置文件特定文件。对于给定的配置文件,它还将尝试加载一个application-{profile}.properties. 对于该特定文件,还考虑了上述加载规则。

所有加载的属性都可以Environment通过springs统一的属性管理方式使用。可以Environment直接使用 来检索配置参数,也可以使用带有@Value注释的占位符进行配置

@Configuration
public class SomeConfigClass {
    @Autowired
    private Environment env;

    public DataSource dataSource() {
        SimpleDriverDataSource ds = new SimpleDriverDataSource();
        ds.setUsername(env.getProperty("jdbc.username"));
        ds.setPassword(env.getProperty("jdbc.password"));
        ds.setDriverClass(Driver.class);
        ds.setUrl(env.getProperty("jdbc.url"));
        return ds;
    }
}

或与@Value

 @Configuration
public class SomeConfigClass {

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    @Value("${jdbc.url}")
    private String url


    public DataSource dataSource() {
        SimpleDriverDataSource ds = new SimpleDriverDataSource();
        ds.setUsername(username);
        ds.setPassword(password);
        ds.setDriverClass(Driver.class);
        ds.setUrl(url);
        return ds;
    }
}

链接

  1. Spring Boot自述文件
  2. Spring 框架配置文件文档
  3. Spring Property Managed博客
  4. Spring Boot Loader自述文件
于 2013-12-06T08:14:29.050 回答