如何通过annotations/pom.xml管理maven配置文件?
How to manage maven profiles through annotations/pom.xml?
参考 -
我不想在 运行ning 时通过命令行参数指定配置文件。因为,如果我在本地更改它,则必须在整个 CI 流中进行更改。
场景:
基本上有两个配置文件 "PROD"
和 "TEST"
。我已经使用这些注释了方法。基本上,我在不同的配置文件下连接不同的数据库。
虽然测试 classes 被注释为 @ActiveProfile("TEST")
我 运行 测试使用 mvn clean test-compile failsafe:integraton-test
和 运行 应用程序使用 mvn springboot:run
问题:
案例一:
问题:PROD 和 TEST 仅 PROD
相关方法 运行。
如果我不使用 @Profile("PROD")
并且只使用 @Profile("TEST")
并且我使用参考中指定的 @ActiveProfiles("TEST")
。上面没有指定任何标志的两个 mvn 命令仅使用未使用配置文件注释的 bean。
案例二:
问题:PROD
没有 运行。
如果我同时使用 PROD
和 TEST
而没有任何标志,mvn clean test-compile failsafe:integraton-test
将完美地命令 运行(仅当指定 @ActiveProfile("TEST")
时,否则我' d 必须发送标志 -Dspring.profiles.active=TEST
) 但 springboot:run
不起作用,因为它无法获取任何数据库配置并且找不到活动配置文件。
即使我使用 PROD 和 @Primary
注释 PROD 配置文件时也是如此
令人惊讶的是,即使我提供命令行参数,结果也是一样的。 mvn springboot:run -Dspring.profiles.active=PROD
如果我用 @ActiveProfiles("PROD")
注释这些配置文件 运行 的主要 class,结果是一样的。
理想Scenario/Expected:
To 运行 测试使用 mvn test-compile failsafe:integration-test
最好不带标志。 (已经实现但产品不工作)
到 运行 产品使用 mvn springboot:run
强调无标志。
优选改动:
Java注解:@Profile
、@ActiveProfile
、@Primary
等注解告诉Spring-boot或maven使用什么。
POM.xml: 设置配置文件以指导 maven 使用什么。
简而言之,我认为您只需将 spring.profiles.active=PROD
添加到您的 application.properties
我整理了一个例子,它打印了一个 bean 的内容,它在 prod ant 测试中是不同的,希望这对你有帮助。
当运行以下代码时,我得到以下输出:
mvn spring-boot:run
:上下文中的字符串是:PROD
mvn clean test
:上下文中的字符串是:TEST
ProfilesApplication.java:
@SpringBootApplication
public class ProfilesApplication implements CommandLineRunner {
Logger logger = LoggerFactory.getLogger(ProfilesApplication.class);
@Autowired
private String profiledString;
public static void main(String[] args) {
SpringApplication.run(ProfilesApplication.class, args);
}
@Bean
@Profile("PROD")
public String prodString() {
return new String("PROD");
}
@Bean
@Profile("TEST")
public String testString() {
return new String("TEST");
}
@Override
public void run(String... args) throws Exception {
logger.info("The String in the context is: {}", profiledString);
}
}
application.properties:
spring.profiles.active=PROD
ProfilesApplicationTests.java:
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("TEST")
public class ProfilesApplicationTests {
@Test
public void contextLoads() {
}
}
参考 -
我不想在 运行ning 时通过命令行参数指定配置文件。因为,如果我在本地更改它,则必须在整个 CI 流中进行更改。
场景:
基本上有两个配置文件 "PROD"
和 "TEST"
。我已经使用这些注释了方法。基本上,我在不同的配置文件下连接不同的数据库。
虽然测试 classes 被注释为 @ActiveProfile("TEST")
我 运行 测试使用 mvn clean test-compile failsafe:integraton-test
和 运行 应用程序使用 mvn springboot:run
问题:
案例一:
问题:PROD 和 TEST 仅 PROD
相关方法 运行。
如果我不使用 @Profile("PROD")
并且只使用 @Profile("TEST")
并且我使用参考中指定的 @ActiveProfiles("TEST")
。上面没有指定任何标志的两个 mvn 命令仅使用未使用配置文件注释的 bean。
案例二:
问题:PROD
没有 运行。
如果我同时使用 PROD
和 TEST
而没有任何标志,mvn clean test-compile failsafe:integraton-test
将完美地命令 运行(仅当指定 @ActiveProfile("TEST")
时,否则我' d 必须发送标志 -Dspring.profiles.active=TEST
) 但 springboot:run
不起作用,因为它无法获取任何数据库配置并且找不到活动配置文件。
即使我使用 PROD 和 @Primary
令人惊讶的是,即使我提供命令行参数,结果也是一样的。 mvn springboot:run -Dspring.profiles.active=PROD
如果我用 @ActiveProfiles("PROD")
注释这些配置文件 运行 的主要 class,结果是一样的。
理想Scenario/Expected:
To 运行 测试使用 mvn test-compile failsafe:integration-test
最好不带标志。 (已经实现但产品不工作)
到 运行 产品使用 mvn springboot:run
强调无标志。
优选改动:
Java注解:@Profile
、@ActiveProfile
、@Primary
等注解告诉Spring-boot或maven使用什么。
POM.xml: 设置配置文件以指导 maven 使用什么。
简而言之,我认为您只需将 spring.profiles.active=PROD
添加到您的 application.properties
我整理了一个例子,它打印了一个 bean 的内容,它在 prod ant 测试中是不同的,希望这对你有帮助。
当运行以下代码时,我得到以下输出:
mvn spring-boot:run
:上下文中的字符串是:PROD
mvn clean test
:上下文中的字符串是:TEST
ProfilesApplication.java:
@SpringBootApplication
public class ProfilesApplication implements CommandLineRunner {
Logger logger = LoggerFactory.getLogger(ProfilesApplication.class);
@Autowired
private String profiledString;
public static void main(String[] args) {
SpringApplication.run(ProfilesApplication.class, args);
}
@Bean
@Profile("PROD")
public String prodString() {
return new String("PROD");
}
@Bean
@Profile("TEST")
public String testString() {
return new String("TEST");
}
@Override
public void run(String... args) throws Exception {
logger.info("The String in the context is: {}", profiledString);
}
}
application.properties:
spring.profiles.active=PROD
ProfilesApplicationTests.java:
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("TEST")
public class ProfilesApplicationTests {
@Test
public void contextLoads() {
}
}