SpringApplication将从以下位置的application.properties文件中加载属性,并将它们添加到Spring环境中:
- A /config subdirectory of the current directory.
- The current directory
- A classpath /config package
- The classpath root
列表按优先级排序(列表中较高位置定义的属性会覆盖较低位置定义的属性)。
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-application-property-files
问:在 tomcat
服务器上运行 war
文件时:如何在类路径或 tomcat 容器之外为应用程序属性
添加其他位置,如 d:\application.properties
?
相对于上述位置,自定义位置应获得最高优先级。
问题是:我当然可以在tomcat webapps
文件夹中的爆炸战争中添加一个/config
文件夹,但是如果清理webapps文件夹并重新部署war,我会丢失任何自定义配置。
因此,我想在外面添加一个额外的位置。
我不得不这样做几次,我发现的最好的方法是将外部目录配置为容器中的类路径资源:
然后,在目录中放置您要外部化的资源,一切都会正常运行。要在Spring加载资源,您可以这样做:
<beans:bean id="externalProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<beans:property name="location" value="classpath:[my-application-name]/applicationProperties.properties" />
<beans:property name="placeholderPrefix" value="!applicationProperties{" />
<beans:property name="placeholderSuffix" value="}" />
</beans:bean>
您可以看到,正如您所说的,您可能希望在每个tomcat中部署多个应用程序,您可以在classpath中设置的文件夹中创建一个目录结构,以维护不同的应用程序。每个
war
应用程序的属性
如果您想在Spring配置中动态地维护应用程序名称部分,可以通过几种方式来实现,在maven中的打包阶段,甚至可以使用应用程序上下文路径
您可以设置指向包含应用程序的文件夹的spring_config_location
环境变量。属性文件。
在Tomcat的情况下,您可以通过将以下行添加到您的来做到这一点
export spring_config_location=/usr/local/tomcat/conf/
将属性文件放在该文件夹中。如果您有多个应用程序,您可以将每个应用程序的属性文件名称设置为唯一。对于Spring Boot应用程序,我是这样做的:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
System.setProperty("spring.config.name", "my-app");
SpringApplication.run(MyApplication.class, args);
}
}
这将选择新的名称时,运行与启动。要在Tomcat上部署时也配置名称,请覆盖< code > SpringBootServletInitializer
的configure,如下所示:
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplication.class).properties("spring.config.name: my-app");
}
}
然后将属性文件命名为:< code>my-app.properties。Spring将寻找这个名字,而不是默认的名字。您可以将所有的应用程序属性文件放在指定的文件夹中,在我们的示例中为< code >/usr/local/Tomcat/conf/。您的外部属性将获得优先权。优先级见此:https://docs . spring . io/spring-boot/docs/current/reference/html/boot-features-external-config . html
更新
自Spring Boot 2以来,spring_config_location
的行为发生了变化(来自迁移指南):
它以前在默认位置列表中添加了一个位置,现在它替换了默认位置。如果您依赖于以前的处理方式,那么现在应该使用spring.config。其他位置。
因此,根据您的用例,您应该考虑将哪些属性设置为环境变量。新的应该类似于< code>setenv.sh中的< code > spring _ config _ additional-location 。参考文档中也描述了从哪里查找文件。
对我来说,最简单的方法是将上下文文件放在Tomcat的配置文件夹中。例如,如果您的应用程序在根路径下运行(例如。your_domain.com/
)您需要创建一个文件 [path_to_your_tomcat]/conf/卡塔利娜/本地主机/ROOT.xml
。如果应用程序在不同的路径中运行,例如 http://your_domain.com/example_path
则该文件应按以下方式命名 [path_to_your_tomcat]/conf/Catalina/本地主机/example_path.xml
。在此文件中,您可以指定外部应用程序 .properties 文件的路径,该文件可以放置在硬盘驱动器上的任何位置。
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Environment name="spring.config.location" value="file:/path/to/your/application/properties/file/" type="java.lang.String"/>
</Context>
我正在尝试将一些遗留的(基于Struts2)web应用程序从Jboss迁移到Open-Liberty服务器,我想知道是否有一种方法可以从web.xml外部化上下文参数(或过滤器init-params)的值,就像在server.xml中使用${}语法或使用eclipse Microprofile的mpConfig特性一样。在最初的项目中,param值是在构建时使用占位符替换注入web.xml中的,但
和以下依赖项: 现在伐木对我来说很好。但现在我正在尝试将文件移到war文件之外,这样就不必更改war文件来更改日志级别。我试图将文件移动到。我找不到指定文件路径的方法,该路径将是${catalina.base}/conf/logback.xml。我发现了一些类似的问题,但我可以找到一个可以使用的解决方案:使用application.properties和logback Externalizatio
我想外部化的选项,有一个可重用的类或注释,我可以扔在排除任何数据库/Hibernate初始化。 因此,与其写: 我想创建一个注释,我可以应用到我的主类: 然后通过注释启用此功能: 问题:注释方法不起作用,Spring仍然尝试加载数据库。为什么啊? 我的最终目标是拥有多个配置文件,其中只有一个加载数据库。
我正在开发一个由几个包组成的OSGi程序,我有时在本地windows dev计算机上运行,有时在经典的Linux上运行。目前,几个专用于资源连接的bundle都有自己的配置文件(属性文件),其中包含一些信息,比如访问一些重要文件的路径(在两个环境中都有)。 但是,由于两个执行环境中的路径不同,我必须在编译之前手动更改配置,这取决于我要在哪个环境中运行我的程序。
问题内容: 我想将一些hibernate配置放在属性文件中,以使其无需构建和部署就可编辑。 我尝试按照不带persistence.xml配置文件的Create JPAEntityManager中的说明解决问题 app.properties: persistence.xml 在初始化代码中,应用程序执行以下序列(查找属性), 但失败并显示错误消息: 有人知道我的配置可能出什么问题吗? 版本:JBos
问题内容: 我正在尝试使用jquery在Facebook墙上发表评论。 但是我的ajax调用不会降低外部url。 谁能解释我们如何在jquery中使用外部网址? 下面是我的代码: 它给xmlhtttprequest错误。 问题答案: 所有这些答案都是错误的! 就像我在评论中说的那样,由于URL未能通过“ 相同来源策略 ”而导致出现此错误的原因,但是您仍然可以使用AJAX函数访问另一个域,请参见Ni