使用Spring启动加载器WarLauncher时如何在war文件之外加载属性文件?

时间:2013-12-06 07:14:25

标签: java classpath manifest war spring-boot

我已经通过指定WarLauncher(Spring引导加载程序的一部分)作为我的启动类来创建可执行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的属性文件。

感谢。

1 个答案:

答案 0 :(得分:5)

默认情况下,

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

  1. classpath root
  2. 当前目录
  3. classpath /config package
  4. /config当前目录的子目录
  5. 所有这些文件(如果可用)按此顺序加载,这意味着1中的属性可以被2,3,4覆盖。所有已加载的属性都可作为Environment的一部分使用,因此可用于占位符以进行配置。

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

    所有加载的属性都可以通过Environment获得,这意味着可以通过弹簧unified property management获得。可以直接使用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 READ-ME
    2. Spring Framework Profile documentation
    3. Spring Property Managed blog
    4. Spring Boot Loader READ-ME