@Profile 在没有 Spring Boot 的情况下无法工作(-Dspring.profiles.active with maven)
@Profile does not work without Spring Boot (-Dspring.profiles.active with maven)
我无法使 @Profile
使用 maven 而没有 Spring Boot。
在 pom.xml 中,我定义了 Maven 配置文件("env" 和 "dev",这也是默认的)。
不幸的是,每当我尝试使用以下方法构建项目时:
mvn clean install -Dspring.profiles.active=env
始终应用 "default" 配置文件(在 Spring 中 - maven 应用 "env" 用于 maven 目的)。
我也试图让它与 System.getProperty("spring.profiles.active")
和 System.getenv("spring.profiles.active")
一起工作,但它们总是返回 null。我认为还值得一提的是,这是非网络应用程序。
Bean(读取正确的属性):
@Bean
@Profile({"default"})
public static PropertySourcesPlaceholderConfigurer defaultProperties() {
return getPropertySourcesPlaceholderConfigurer("db.yml");
}
@Bean
@Profile({"env"})
public static PropertySourcesPlaceholderConfigurer envProperties() {
return getPropertySourcesPlaceholderConfigurer("db-env.yml");
}
@Bean
@Profile({"test"})
public static PropertySourcesPlaceholderConfigurer devProperties() {
return getPropertySourcesPlaceholderConfigurer("db-test.yml");
}
private static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer(String resource) {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource(resource));
final Properties object = yaml.getObject();
if (object != null) {
propertySourcesPlaceholderConfigurer.setProperties(object);
}
return propertySourcesPlaceholderConfigurer;
}
Pom.xml:
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
<property>
<name>spring.profiles.active</name>
<value>dev</value>
</property>
</activation>
</profile>
<profile>
<id>env</id>
<activation>
<property>
<name>spring.profiles.active</name>
<value>env</value>
</property>
</activation>
</profile>
</profiles>
您需要在 运行 命令时指定 Maven 配置文件(不是 Spring 配置文件):
mvn clean install -Penv
参见:http://maven.apache.org/guides/introduction/introduction-to-profiles.html
Spring 配置文件用于 运行 您的应用程序,而不是构建。执行应用程序时传递 -Dspring.profiles.active=env
。在您的示例中,您正在执行一个 mvn install
,它不会执行您的应用程序。
我无法使 @Profile
使用 maven 而没有 Spring Boot。
在 pom.xml 中,我定义了 Maven 配置文件("env" 和 "dev",这也是默认的)。
不幸的是,每当我尝试使用以下方法构建项目时:
mvn clean install -Dspring.profiles.active=env
始终应用 "default" 配置文件(在 Spring 中 - maven 应用 "env" 用于 maven 目的)。
我也试图让它与 System.getProperty("spring.profiles.active")
和 System.getenv("spring.profiles.active")
一起工作,但它们总是返回 null。我认为还值得一提的是,这是非网络应用程序。
Bean(读取正确的属性):
@Bean
@Profile({"default"})
public static PropertySourcesPlaceholderConfigurer defaultProperties() {
return getPropertySourcesPlaceholderConfigurer("db.yml");
}
@Bean
@Profile({"env"})
public static PropertySourcesPlaceholderConfigurer envProperties() {
return getPropertySourcesPlaceholderConfigurer("db-env.yml");
}
@Bean
@Profile({"test"})
public static PropertySourcesPlaceholderConfigurer devProperties() {
return getPropertySourcesPlaceholderConfigurer("db-test.yml");
}
private static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer(String resource) {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource(resource));
final Properties object = yaml.getObject();
if (object != null) {
propertySourcesPlaceholderConfigurer.setProperties(object);
}
return propertySourcesPlaceholderConfigurer;
}
Pom.xml:
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
<property>
<name>spring.profiles.active</name>
<value>dev</value>
</property>
</activation>
</profile>
<profile>
<id>env</id>
<activation>
<property>
<name>spring.profiles.active</name>
<value>env</value>
</property>
</activation>
</profile>
</profiles>
您需要在 运行 命令时指定 Maven 配置文件(不是 Spring 配置文件):
mvn clean install -Penv
参见:http://maven.apache.org/guides/introduction/introduction-to-profiles.html
Spring 配置文件用于 运行 您的应用程序,而不是构建。执行应用程序时传递 -Dspring.profiles.active=env
。在您的示例中,您正在执行一个 mvn install
,它不会执行您的应用程序。