java 如何从系统变量设置Spring截面轮廓?

ars1skjm  于 2022-12-21  发布在  Java
关注(0)|答案(8)|浏览(147)

我有一个Spring项目,它使用另一个项目。每个项目都有自己的Spring概要文件,每个概要文件都使用applicationContext.xml*.properties从Java代码初始化。我从args[]注入概要文件。问题是第二个项目使用来自的env默认配置applicationContext.xml我无法将env从args[]注入到第二个项目中,我尝试寻找一篇文章来解释Spring配置文件是如何工作的。
1.当applicationContext.xml上未配置默认值时,是否存在一个层次结构,它将在该层次结构上查找概要文件?
1.系统变量是否比applicationContext.xml配置更强?
1.你认为我的挑战的最佳解决方案是什么?
如能提供有关这一主题的文章或示例,将不胜感激。

jhiyze9q

jhiyze9q1#

SPRING_PROFILES_ACTIVE是覆盖/选择Spring轮廓的环境变量

bwleehnv

bwleehnv2#

如果您为JVM提供Spring配置文件,应该不会有任何问题:

java -Dspring.profiles.active=development -jar yourApplication.jar

另请参见Spring文档:
http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html

69.5设置活动Spring配置文件

Spring环境有一个API来实现这个功能,但是通常你需要设置一个System属性(spring.profiles.active)或者一个OS环境变量(SPRING_PROFILES_ACTIVE)。例如,用一个-D参数启动你的应用程序(记住把它放在主类或者jar归档文件之前):
$ java -jar -Dspring.配置文件.活动=生产演示-0.0.1-SNAPSHOT.jar
在Sping Boot 中,您还可以在www.example.com中设置活动配置文件application.properties,例如
Spring.配置文件.活动=生产
用这种方式设置的值会被System属性或环境变量设置替换,但不会被SpringApplicationBuilder.profiles()方法替换,因此后一个Java API可以用来扩充配置文件,而无需更改默认值。
有关更多信息,请参见第25章“配置文件”中的“Sping Boot 特性”部分。

sg2wtvxw

sg2wtvxw3#

我通常使用基于注解的配置而不是基于XML的配置来配置applicationContext。无论如何,我相信它们具有相同的优先级

  • 回答您的问题,系统变量具有更高的优先级 *

从applicationContext取得以设定档为基础的Bean

  • ###在Bean上使用 @Configuration 文件
@Component
@Profile("dev")
public class DatasourceConfigForDev

现在,配置文件为dev
注意:如果概要文件为@Profile("!dev"),则概要文件将排除dev,并适用于所有其他配置文件。

  • ###使用XML中的配置文件属性
<beans profile="dev">
    <bean id="DatasourceConfigForDev" class="org.skoolguy.profiles.DatasourceConfigForDev"/>
</beans>

设置配置文件的值:

  • ###通过WebApplicationInitializer接口编程

在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");
  • ###web.xml中的上下文参数

也可以使用上下文参数在Web应用程序的web.xml中激活配置文件:

<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>
  • ###JVM系统参数

作为参数传递的配置文件名称将在应用程序启动期间激活:

-Dspring.profiles.active=dev

在IDE中,您可以设置应用程序运行时使用的环境变量和值。以下是Eclipse中的运行配置:

  • ###环境变量

通过命令行设置:export spring_profiles_active=dev
任何没有指定概要文件的bean都属于"默认"概要文件。

优先级顺序为:

  1. web.xml中的上下文参数
  2. Web应用程序初始化程序
  3. JVM系统参数
    1.环境变量
x3naxklr

x3naxklr4#

如果您使用Docker部署spring Boot 应用,您可以使用标志e设置 profile
对接器运行-e“Spring配置文件活动=产品”-p 8080:8080 -tr.test.co/myapp:latest

i7uaboj4

i7uaboj45#

可以通过提供-Dspring.profiles.active=<env>设置Spring剖面
对于source(src)目录中的java文件,可以通过System.getProperty("spring.profiles.active")使用
对于test目录中的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}"
}
mec1mxoz

mec1mxoz6#

我的解决方案是将环境变量设置为spring.profiles.active=development,这样,在该机器上运行的所有应用程序都将引用该变量并启动该应用程序。

application.properties
system properties
environment variable
2exbekwf

2exbekwf7#

如果我运行命令行:java -Dspring.profiles.active=development -jar yourApplication.jar从我的webapplication目录,它指出路径是不正确的。所以我只是在手动定义的配置文件在application.properties文件如下:

spring.profiles.active=mysql

spring.profiles.active=postgres

spring.profiles.active=mongodb
xzv2uavs

xzv2uavs8#

太晚了党,但这里有这个主题的新趋势: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>

!NB!如果使用&时出现问题,请将其替换为&amp;

相关问题