Java app.props中定义的活动配置文件,但环境变量返回活动配置文件的空数组
我遇到的问题是:通过spring.profiles.active=development在application.properties中定义了活动概要文件。但是,当我使用Spring的环境变量getActiveProfiles()时,返回的只是一个空字符串数组。应用程序将启动“以下配置文件处于活动状态:开发”。非常感谢您的帮助。下面是一个简单的类,用于检查我是否可以检索配置文件 已尝试自动关联环境变量,但无效。此类用@Component标记,并实现环境感知 注意:我已经看过了几乎所有关于这个问题的SO线程,所以请不要标记为重复,因为没有解决我的问题Java app.props中定义的活动配置文件,但环境变量返回活动配置文件的空数组,java,spring-boot,Java,Spring Boot,我遇到的问题是:通过spring.profiles.active=development在application.properties中定义了活动概要文件。但是,当我使用Spring的环境变量getActiveProfiles()时,返回的只是一个空字符串数组。应用程序将启动“以下配置文件处于活动状态:开发”。非常感谢您的帮助。下面是一个简单的类,用于检查我是否可以检索配置文件 已尝试自动关联环境变量,但无效。此类用@Component标记,并实现环境感知 注意:我已经看过了几乎所有关于这个问题
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
System.out.println(environment.getActiveProfiles()[0]);
}
当然,我们得到了一个索引越界异常
application.properties(由于敏感信息而省略部分内容)
主要类别:
@SpringBootApplication
@PropertySource("classpath:application.properties")
@ComponentScan("uk.co.demo*")
@Configuration
public class EbecsIntegrationAdapterApplication {
@Value("${activemq.broker_url}") private String amqBrokerUrl;
@Value("${activemq.username}") private String amqUsername;
@Value("${activemq.password}") private String amqPassword;
@Value("${server.ssl.key-store}") private String amqKeystore;
@Value("${server.ssl.key-store-password}") private String
amqKeyStorePassword;
@Bean
public ConnectionFactory activemqConnectionFactory() throws Exception {
ActiveMQSslConnectionFactory connectionFactory = new
ActiveMQSslConnectionFactory();
connectionFactory.setBrokerURL(this.amqBrokerUrl + "?
jms.prefetchPolicy.all=1");
connectionFactory.setUserName(this.amqUsername);
connectionFactory.setPassword(this.amqPassword);
connectionFactory.setTrustAllPackages(true);
connectionFactory.setTrustStore(this.amqKeystore);
connectionFactory.setTrustStorePassword(this.amqKeyStorePassword);
connectionFactory.setKeyStore(this.amqKeystore);
connectionFactory.setKeyStorePassword(this.amqKeyStorePassword);
return new PooledConnectionFactory(connectionFactory);
}
@Bean
public ActiveMQComponent activemqComponent(JmsTransactionManager
jmsTransactionManager, ConnectionFactory connectionFactory) {
ActiveMQComponent activeMQComponent = new ActiveMQComponent();
activeMQComponent.setTestConnectionOnStartup(true);
activeMQComponent.setTransacted(true);
activeMQComponent.setCacheLevelName("CACHE_CONSUMER");
activeMQComponent.setConnectionFactory(connectionFactory);
activeMQComponent.setTransactionManager(jmsTransactionManager);
return activeMQComponent;
}
@Bean
public JmsTransactionManager jmsTransactionManager(ConnectionFactory connectionFactory) {
return new JmsTransactionManager(connectionFactory);
}
@Bean
public SpringTransactionPolicy springTransactionPolicy(TransactionTemplate transactionManager) {
return new SpringTransactionPolicy(transactionManager);
}
public static void main(String[] args) {
SpringApplication.run(EbecsIntegrationAdapterApplication.class, args);
TestEnv testEnv = new TestEnv();
testEnv.printEnvs();
}
测试级别:
@Component
public class TestEnv implements EnvironmentAware {
private Environment environment;
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
public void printEnvs() {
System.out.println(environment.getActiveProfiles()[0]);
}
}假设
ebecintegrationadapter应用程序
和TestEnv
在同一个包中
- 省去不需要的注释
已经是一个@SpringBootApplication
组件,已经加载了application.properties,并且已经是一个@Configuration
@ComponentScan
- 如果需要扫描额外的文件包,则不应在文件包名称末尾添加*。最好的方法是坚持最佳实践
- 删除主(args)中的
newtestenv()
- 通过构造函数注入自动连线
环境
启动应用程序时是否传递-Dspring.profiles.active标志?您能在问题中添加application.properties文件吗?我目前没有传递该值。仅使用spring.profiles.active。已更新问题以包括属性。启动时,spring boot始终显示活动的配置文件。以下配置文件处于活动状态。。。第二行。你看到了什么?嗨,这是它打印出来的:“以下配置文件处于活动状态:开发”。但是,Environment.getActiveProfiles()函数返回一个空字符串[]数组。然后,spring不会拾取该组件。你的所有组件都需要在同一个包中,或者是你的主类的直接子包中你我的朋友是个英雄!这奏效了!。是否可以在不同的包中复制使用env变量的类?很高兴我能提供帮助。因此,如果我在主包之外的包中使用printEnvs(),则不可能在主包或所有子包(子包)中复制。嗨,德克,你知道为什么我的环境变量在我尝试将它传递给另一个包中的类时变为null吗?我认为这个物体仍然会保留它的价值。。。
@Component
public class TestEnv implements EnvironmentAware {
private Environment environment;
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
public void printEnvs() {
System.out.println(environment.getActiveProfiles()[0]);
}
@SpringBootApplication
public class EbecsIntegrationAdapterApplication {
@Component
public class TestEnv {
private Environment environment;
public TestEnv(Environment environment) {
this.environment = environment;
printEnvs();
}
public void printEnvs() {
System.out.println(environment.getActiveProfiles()[0]);
}
}