使用spring boot loader WarLauncher时如何在war文件之外加载属性文件?

Posted

技术标签:

【中文标题】使用spring boot loader WarLauncher时如何在war文件之外加载属性文件?【英文标题】:How to load property files outside of war file when using spring boot loader WarLauncher? 【发布时间】:2013-12-23 11:13:53 【问题描述】:

我通过将 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() 来加载属性文件。下面显示了相同的代码sn-p:

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

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

谢谢。

【问题讨论】:

将自动拾取工件旁边的application.properties。你不需要自己加载它,因为 spring-boot 会自动为你添加它。 我更改了 application.properties 的代码。我在我的战争文件旁边创建了 application.properties。在执行时它仍然给出 FileNotFoundException。 如前所述,spring-boot 已经加载了该文件,因此您无需加载它...为什么要自己加载它?此外,它与您的工件并列的事实使得它不在类路径上,而是在文件系统上。所以用ClassPathResource 加载它是行不通的......另见projects.spring.io/spring-boot/docs/spring-boot/README.html 嗯...但是,如何访问该属性文件中的值? 通过在@Value 注释中使用占位符或将它们从Environment 中拉出,您可以通过在配置中添加Environment 类型的字段并对其进行注释来简单地注入后者与@Autowired。但总的来说使用@Value 更容易。 【参考方案1】:

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

    类路径根 当前目录 类路径/config/config当前目录的子目录

所有这些文件,如果可用,则按该顺序加载,这意味着从 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;
    

链接

    弹簧靴READ-ME Spring 框架配置文件documentation Spring 物业管理blog Spring Boot 加载器READ-ME

【讨论】:

我没有使用 Spring boot,而只是使用 Spring boot loader 的 WarLauncher。您的解决方案在这种情况下有效吗? 我的 war 文件依赖于(不是编译时而是在运行时)Spring 引导加载程序组件。 war 文件还依赖于包含属性文件加载逻辑的 X(jar 文件)组件。希望,我提供了所需的上下文。 您正在使用 spring-boot 战争启动器。它又使用SpringApplication,它又支持加载属性。我强烈建议您阅读 Spring boot 上可用的当前稀疏文档。简而言之,使用提供给您的东西,而不是尝试重新发明***并解决框架问题。

以上是关于使用spring boot loader WarLauncher时如何在war文件之外加载属性文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用spring boot loader WarLauncher时如何在war文件之外加载属性文件?

Spring Boot 同步启动器

spring boot jar启动

Spring Boot 第二弹,配置文件详解-史上最全

boot and loader

GRUB(Boot Loader)