使用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文件之外加载属性文件?的主要内容,如果未能解决你的问题,请参考以下文章