一个解决方案可能是加载 application-{profile}.properties 作为@PropertySource注释,正如这个问题所建议的那样,但随后日志记录系统将无法正常工作,如文档中所示。
日志记录系统在应用程序生命周期的早期进行初始化,因此在通过@PropertySource注释加载的属性文件中找不到日志记录属性。
这意味着您在 application-{profiles}.properties 中的日志记录属性,如下所示:
logging.config=classpath:myapp1/logback.xml
logging.path = /path/to/logs
logging.file = myapp1.log
将被忽略,日志记录系统将无法正常工作。
为了解决这个问题,我使用了SpringApplicationBuilder.properties()方法在配置应用程序时加载属性。在那里,我设置了Spring Boot使用的“spring.config.location”来加载所有应用程序-{profiles}.properties:
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) {
return springApplicationBuilder
.sources(Application.class)
.properties(getProperties());
}
public static void main(String[] args) {
SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class)
.sources(Application.class)
.properties(getProperties())
.run(args);
}
static Properties getProperties() {
Properties props = new Properties();
props.put("spring.config.location", "classpath:myapp1/");
return props;
}
}
然后,我将属性文件从 src/main/resources 移动到 src/main/resources/myapp1
.
├src
| └main
| └resources
| └myapp1
| └application.properties
| └application-development.properties
| └logback.xml
└─pom.xml
在pom中.xml我必须将嵌入式tomcat库的范围设置为“提供”。此外,要从最终战争中排除 src/main/resources/myapp1 中的所有属性文件,并生成一个免配置、可部署的 war:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<packagingExcludes>
**/myapp1/
</packagingExcludes>
</configuration>
</plugin>
然后在雄猫我有
├apache-tomcat-7.0.59
└lib
├─myapp1
| └application.properties
| └logback.xml
└─myapp2
└application.properties
└logback.xml
现在我可以生成免配置战争并将其放入apache-tomcat-7.0.59 / webapps文件夹中。属性文件将使用类路径进行解析,对于每个 Web 应用,将单独解析:
apache-tomcat-7.0.59/lib/myapp1
apache-tomcat-7.0.59/lib/myapp2
apache-tomcat-7.0.59/lib/myapp3