2017-04-26 5 views
0

Ref - Maven ProfilesWie man Maven-Profile durch Anmerkungen/pom.xml verwaltet?


Ich will nicht Profil über die Befehlszeilenargumente angeben, während der Ausführung. Weil, wenn ich es lokal ändere, müssen Änderungen über CI-Stream vorgenommen werden.


Szenario:

Es gibt grundsätzlich zwei Profile "PROD" und "TEST". Ich habe Methoden mit diesen Methoden kommentiert. Grundsätzlich verbinde ich verschiedene Datenbanken unter verschiedenen Profilen.

Während die Testklassen mit Anmerkungen versehen werden mit @ActiveProfile("TEST")

Ich betreibe Tests mvn clean test-compile failsafe:integraton-test mit und führen Anwendung mit mvn springboot:run


Problem:

Fall 1:
Ausgabe: Nur PROD hat mich verwandt thods laufen für PROD und TEST.

Wenn ich nicht @Profile("PROD") verwende und nur @Profile("TEST") benutze und verwende ich @ActiveProfiles("TEST") wie in der Referenz angegeben. Beide mvn-Befehle ohne ein oben angegebenes Flag verwenden nur die Beans, die nicht mit Profilen versehen sind.
 

Fall 2:
Ausgabe: PROD nicht ausgeführt.

Wenn ich beide PROD verwenden und TEST ohne Flagge, perfekt mvn clean test-compile failsafe:integraton-test Befehl ausgeführt wird (nur wenn @ActiveProfile("TEST") angegeben sonst würde ich eine Fahne -Dspring.profiles.active=TEST senden), aber springboot:run funktioniert nicht, da es keine Datenbankkonfiguration abholen und kein aktives Profil gefunden.

Dies ist der Fall, auch wenn ich ART Profile sowohl mit ART und @Primary

überraschenderweise auch wenn ich biete Befehlszeilenargument Anmerken das Ergebnis ist das gleiche. mvn springboot:run -Dspring.profiles.active=PROD

Wenn ich die Hauptklasse annotiere, in der diese Profile mit @ActiveProfiles("PROD") ausgeführt werden, ist das Ergebnis das gleiche.
 


Ideal-Szenario/Erwartet:

Tests laufen mvn test-compile failsafe:integration-test ohne Flagge vorzugsweise verwendet wird. (Bereits erreicht, aber prod funktioniert nicht)

Um Prod mit mvn springboot:run Schwerpunkt der keine Flags zu betreiben.


Bevorzugte Änderungen:

Java Anmerkungen: Anmerkungen wie @Profile, @ActiveProfile, @Primary die Frühlings-Boot- oder maven sagt, was zu verwenden.

POM.xml: Festlegen von Profilen für die Ausrichtung von Maven, was zu verwenden ist.

+0

Wenn Sie mit 'mvn sauberen Test kompilieren ausfallsicher: integraton-test' Sie nicht den Lebenszyklus verstanden zu haben schien. Warum nicht einfach 'mvn clean verify' (Wenn Sie das Failsafe-Plugin richtig konfiguriert haben) ... Ansonsten ist das @Profile nur für Federprofile, aber nicht für maven profile ... – khmarbaise

+0

' mvn verify' läuft auch Unit-Tests. Ich möchte nur Integrationstests durchführen. –

+0

Sie mischen Federprofile und Maven-Profile. Beide sind verschiedene Dinge und dienen einem anderen Zweck. –

Antwort

1

kurz Ich glaube, Sie müssen nur spring.profiles.active=PROD Ihr application.properties

ich ein Beispiel zusammen fügen, die den Inhalt einer Bohne druckt, die zwischen prod Ameise Test unterscheidet, hoffen, das hilft.

Wenn der Code unten i folgende Ausgabe ausgeführt wird:

mvn spring-boot:run: Der String im Kontext ist: ART

mvn clean test: Der String im Kontext ist: 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() { 
    } 
} 
+0

Funktioniert wie ein Charme. Vielen Dank. –

Verwandte Themen