如何通过annotations / pom.xml管理maven配置文件?

时间:2017-04-26 06:13:23

标签: java maven spring-boot maven-profiles

参考 - 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未运行。

如果我同时使用PRODTEST而没有任何标记,mvn clean test-compile failsafe:integraton-test命令运行完美(仅当指定@ActiveProfile("TEST")时,否则我必须发送标记{ {1}})但-Dspring.profiles.active=TEST不起作用,因为它无法获取任何数据库配置且找不到有效的配置文件。

即使我使用PROD和springboot:run

注释PROD配置文件,情况也是如此

令人惊讶的是,即使我提供命令行参数,结果也是一样的。 @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使用的配置文件。

1 个答案:

答案 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>