Как управлять профилями 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() {
}
}