如何通过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 没有 运行。

如果我同时使用 PRODTEST 而没有任何标志,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() {
    }
}