我有一个使用另一个项目的Spring项目。每个项目都有自己的弹簧配置文件,使用*.properties
和args[]
为每个配置文件初始化java代码。我从applicationContext.xml
注入个人资料。 问题是第二个项目使用来自 args[]
的env的默认配置
我无法将applicationContext.xml
的env注入到第二个项目中,我试着寻找一篇能解释Spring配置文件如何工作的文章。
applicationContext.xml
未配置默认值时,是否存在查看配置文件的层次结构?$xml = new SimpleXMLElement($string);
$result = $xml->xpath('.//PR_DRE/row/*');
配置?关于该主题或甚至示例的文章将非常感谢!! 提前致谢。
答案 0 :(得分:63)
SPRING_PROFILES_ACTIVE是覆盖/选择Spring配置文件的环境变量
答案 1 :(得分:37)
如果您为JVM提供Spring配置文件,那么应该没有问题:
java -Dspring.profiles.active=development -jar yourApplication.jar
另见Spring-Documentation:
69.5设置活动的弹簧配置文件
Spring Environment有一个API,但通常你会设置 System属性(spring.profiles.active)或OS环境 变量(SPRING_PROFILES_ACTIVE)。例如。用a启动你的应用程序 -D参数(记得把它放在主类或jar存档之前):
$ java -jar -Dspring.profiles.active = production 演示0.0.1-SNAPSHOT.jar
在Spring Boot中,您还可以设置活动配置文件 application.properties,例如
spring.profiles.active =生产
以这种方式设置的值将替换为System属性或环境 变量设置,但不是SpringApplicationBuilder.profiles() 方法。因此,后一个Java API可用于扩充配置文件 不改变默认值。
请参阅第25章,“Spring Boot功能”部分中的配置文件 更多信息。
答案 2 :(得分:19)
我通常使用基于注释的配置而不是基于基于XML的配置来配置applicationContext。无论如何,我相信他们两个都具有相同的优先级。
*回答您的问题,系统变量具有更高的优先级*
@Component
@Profile("dev")
public class DatasourceConfigForDev
现在,个人资料为dev
注意:如果配置文件指定为
@Profile("!dev")
,那么个人资料将排除开发人员,并且适用于所有其他人。
<beans profile="dev">
<bean id="DatasourceConfigForDev" class="org.skoolguy.profiles.DatasourceConfigForDev"/>
</beans>
在Web应用程序中,可以使用WebApplicationInitializer以编程方式配置ServletContext
@Configuration
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setInitParameter("spring.profiles.active", "dev");
}
}
您还可以直接在环境上设置配置文件:
@Autowired
private ConfigurableEnvironment env;
...
env.setActiveProfiles("dev");
配置文件:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-config.xml</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
作为参数传递的配置文件名称将在应用程序启动期间激活:
-Dspring.profiles.active=dev
在IDE中,您可以设置应用程序运行时要使用的环境变量和值。以下是Eclipse中的“运行配置”:
通过命令行设置:export spring_profiles_active=dev
任何未指定配置文件的bean都属于“默认”配置文件。
答案 3 :(得分:2)
如果您使用docker来部署spring boot应用程序,则可以使用 e 标志设置配置文件:
docker run -e&#34; SPRING_PROFILES_ACTIVE = prod&#34; -p 8080:8080 -t r.test.co/myapp:latest
答案 4 :(得分:1)
我的解决方案是将环境变量设置为spring.profiles.active=development
。这样,在该机器上运行的所有应用程序都将引用变量并启动应用程序。 spring加载属性的顺序如下
application.properties
system properties
environment variable
答案 5 :(得分:1)
如果我从我的webapplication目录运行命令行:java -Dspring.profiles.active=development -jar yourApplication.jar
,则说明该路径不正确。所以我只是在application.properties文件中手动定义了配置文件,如下所示:
spring.profiles.active=mysql
或
spring.profiles.active=postgres
或
spring.profiles.active=mongodb
答案 6 :(得分:0)
您可以通过提供-Dspring.profiles.active=<env>
对于 source(src)目录中的Java文件,您可以使用
System.getProperty("spring.profiles.active")
对于测试目录中的Java文件,您可以提供
SPRING_PROFILES_ACTIVE
至<env>
或
因为,“测试”任务将忽略“环境”,“ jvmArgs”和“ systemProperties”。在根build.gradle
中,添加一个任务来设置jvm属性和环境变量。
test {
def profile = System.properties["spring.profiles.active"]
systemProperty "spring.profiles.active",profile
environment "SPRING.PROFILES_ACTIVE", profile
println "Running ${project} tests with profile: ${profile}"
}
答案 7 :(得分:0)
参加聚会为时已晚,但以下是该主题的新趋势:https://howtodoinjava.com/spring-boot2/logging/profile-specific-logging/
这是一个很好的例子:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="c:/temp/spring.log}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d</fileNamePattern>
</rollingPolicy>
</appender>
<springProfile name="local | dev">
<logger name="org.springframework" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</springProfile>
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</springProfile>
<springProfile name="!local & !dev & !prod">
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</springProfile>
</configuration>
!注意!如果您在使用 &
时遇到问题,请将其替换为 &