Как управлять профилями Maven через аннотации /pom.xml?

Ref - Maven Профили


Я не хочу указывать профиль через аргументы командной строки во время работы. Потому что, если я изменяю это локально, то изменения должны быть сделаны через поток CI.


Сценарий:

Есть в основном два профиля "PROD" а также "TEST", Я аннотировал методы, использующие их. По сути, я подключаю разные базы данных под разными профилями.

В то время как тестовые классы снабжены комментариями @ActiveProfile("TEST")

Я запускаю тесты, используя mvn clean test-compile failsafe:integraton-test и запустите приложение, используя mvn springboot:run


Проблема:

Случай 1:
Проблема: только PROD связанные методы работают для PROD и TEST.

Если я не использую @Profile("PROD") и только использовать @Profile("TEST") и я использую @ActiveProfiles("TEST") как указано в ссылке. Обе команды mvn без какого-либо указанного выше флага используют только компоненты, которые не аннотированы профилями.

Случай 2:
Выпуск: PROD не работает

Если я использую оба PROD а также TEST без какого-либо флага, mvn clean test-compile failsafe:integraton-test команда работает отлично (только когда @ActiveProfile("TEST") указано в противном случае я должен был бы отправить флаг -Dspring.profiles.active=TEST) но springboot:run не работает, так как не может подобрать конфигурацию базы данных и не найден активный профиль.

Это имеет место даже тогда, когда я аннотирую профили PROD с помощью PROD и @Primary

Удивительно, даже если я предоставлю аргумент командной строки, результат будет таким же. mvn springboot:run -Dspring.profiles.active=PROD

Если я аннотирую основной класс, где эти профили запускаются с @ActiveProfiles("PROD"), результат тот же.


Идеальный сценарий / ожидаемый:

Для запуска тестов с использованием mvn test-compile failsafe:integration-test желательно без флага. (Уже достигнут, но продукт не работает)

Чтобы запустить продукт с помощью mvn springboot:run Акцент нет флагов.


Предпочтительные изменения:

Java-аннотации: аннотации, такие как @Profile, @ActiveProfile, @Primary который сообщает Spring-boot или maven, что использовать.

POM.xml: настройка профилей для указания maven, что использовать.

1 ответ

Решение

Короче я думаю, что вам просто нужно добавить spring.profiles.active=PROD на ваш application.properties

Я собрал пример, который печатает содержимое компонента, который отличается от теста prod ant, надеюсь, это поможет.

При запуске кода ниже я получаю следующий вывод:

mvn spring-boot:run: Строка в контексте: PROD

mvn clean 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() {
    }
}
Другие вопросы по тегам