参考 - Maven Profiles
我不希望在运行时通过命令行参数指定配置文件。因为,如果我在本地更改它,则必须通过CI流进行更改。
情境:
基本上有两个配置文件"PROD"
和"TEST"
。我有使用这些注释的方法。基本上,我在不同的配置文件下连接不同的数据库
虽然测试类使用@ActiveProfile("TEST")
我使用mvn clean test-compile failsafe:integraton-test
运行测试并使用mvn springboot:run
问题:
案例1:
问题:仅为PROD和TEST运行PROD
个相关方法。
如果我不使用@Profile("PROD")
并仅使用@Profile("TEST")
,我会使用参考中指定的@ActiveProfiles("TEST")
。上面没有指定任何标志的mvn命令都只使用未使用配置文件注释的bean
案例2:
问题:PROD
未运行。
如果我同时使用PROD
和TEST
而没有任何标记,mvn clean test-compile failsafe:integraton-test
命令运行完美(仅当指定@ActiveProfile("TEST")
时,否则我必须发送标记{ {1}})但-Dspring.profiles.active=TEST
不起作用,因为它无法获取任何数据库配置且找不到有效的配置文件。
即使我使用PROD和springboot:run
令人惊讶的是,即使我提供命令行参数,结果也是一样的。 @Primary
如果我使用mvn springboot:run -Dspring.profiles.active=PROD
注释运行这些配置文件的主类,结果是相同的。
理想情景/预期:
使用@ActiveProfiles("PROD")
运行测试,最好不使用标记。 (已经实现但是生产不起作用)
使用mvn test-compile failsafe:integration-test
强调没有标记来运行prod。
优先更改:
Java注释:mvn springboot:run
,@Profile
,@ActiveProfile
等注释告诉Spring-boot或maven使用什么。
POM.xml:设置用于指导maven使用的配置文件。
答案 0 :(得分:1)
简而言之,我认为您只需要将application.properties
添加到mvn spring-boot:run
我把一个打印豆子内容的例子放在一起,不同之处在于prod ant测试,希望这有帮助。
运行以下代码时,我得到以下输出:
mvn clean test
:上下文中的String为:PROD
@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);
}
}
:上下文中的字符串是:TEST
ProfilesApplication.java:
spring.profiles.active=PROD
application.properties:
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("TEST")
public class ProfilesApplicationTests {
@Test
public void contextLoads() {
}
}
ProfilesApplicationTests.java:
<httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL">
<remove statusCode="500" subStatusCode="100" />
<remove statusCode="500" subStatusCode="-1" />
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="/" responseMode="ExecuteURL" />
<error statusCode="500" prefixLanguageFilePath="" path="/error_500.asp" responseMode="ExecuteURL" />
<error statusCode="500" subStatusCode="100" path="/error_500.asp" responseMode="ExecuteURL" />
</httpErrors>