Domyślny profil na wiosnę 3.1

100

W mojej aplikacji mam ziarenka z adnotacją @Profile("prod")i @Profile("demo"). Pierwsza, jak możesz się domyślić :), jest używana na ziarnach, które łączą się z produkcyjną bazą danych, a druga dodaje adnotacje do fasoli, które używają fałszywej bazy danych ( HashMaplub cokolwiek innego) - aby przyspieszyć rozwój.

Chciałbym mieć domyślny profil ( "prod"), który będzie używany zawsze, jeśli nie zostanie zastąpiony przez „ coś innego ”.

Idealnie byłoby mieć w moim web.xml:

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>prod</param-value>
</context-param>

a następnie zastąp to, -Dspring.profiles.active="demo"aby móc zrobić:

mvn jetty:run -Dspring.profiles.active="demo". 

Ale niestety to nie działa. Masz jakiś pomysł, jak mogłem to osiągnąć? Ustawienie -Dspring.profiles.active="prod"we wszystkich moich środowiskach nie wchodzi w grę.

Michał Margiel
źródło

Odpowiedzi:

67

Z mojego doświadczenia wynika, że ​​używanie

@Profile("default")

fasola zostanie dodana do kontekstu tylko wtedy, gdy żaden inny profil nie zostanie zidentyfikowany. Jeśli przekażesz inny profil, np. -Dspring.profiles.active="demo"Ten profil jest ignorowany.

Paul Philion
źródło
4
Zaakceptowana odpowiedź zależy od pliku web.xml (i to jest w porządku), ale ta odpowiedź działa niezależnie od tego, czy masz plik web.xml, czy nie, i dlatego jest bardziej użyteczna dla każdego.
Jay
1
to rozwiązanie jest znacznie czystsze
cahen
Czy to oficjalna funkcja czy jakiś efekt uboczny? Czy chcesz odsyłacz do dokumentacji Spring, w której jest opisana ta funkcja?
rustyx
111

Zdefiniuj środowisko produkcyjne jako profil domyślny w pliku web.xml

<context-param>
   <param-name>spring.profiles.default</param-name>
   <param-value>prod</param-value>
</context-param>

a jeśli chcesz użyć innego profilu, przekaż go jako właściwość systemową

mvn -Dspring.profiles.active="demo" jetty:run
andih
źródło
3
Nie, próbował zdefiniować aktywny profil w pliku web.xml i jako właściwość systemową. W moim rozwiązaniu konfiguruję domyślny profil w web.xml i nadpisuję / definiuję aktywny profil poprzez właściwość systemową. Jeśli nie ma aktywnego aktywnego profilu, zostanie użyty domyślny.
andih
1
Dzięki! to jest dokładnie to, czego chciałem! nigdzie go nie znalazłem: /
Michał Margiel
Jeden problem z tym podejściem: jeśli ustawisz spring.profiles.default=prodw application.properties, wtedy application-prod.propertiesnie zostanie załadowany. Jest to sprzeczne z intuicją.
gamliela
@gamliela Podejście to nie ustawia domyślnego profilu w application.propertiespliku. Aby wiedzieć, że application-prod.propertiespowinien być używany, musisz znać profil. To właśnie robi to podejście. Definiuje profile poza kontekstem sprężyny albo web.xml(domyślnie), albo poprzez zmienną środowiskową (nadpisz wartość domyślną).
andih
@andih Tak, wiem to, ale mówię tylko, że nie jest to intuicyjne i dlatego jest problematyczne. Ponieważ application-default.propertiesjestem załadowany, spodziewam się również, że application-newdefault.propertieszostanie załadowany. To nie jest problem z twoim rozwiązaniem, to problem z Spring ...
gamliela
6

Mam ten sam problem, ale używam WebApplicationInitializer do programowego konfigurowania ServletContext (Servlet 3.0+). Więc robię co następuje:

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        // Create the 'root' Spring application context
        final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        // Default active profiles can be overridden by the environment variable 'SPRING_PROFILES_ACTIVE'
        rootContext.getEnvironment().setDefaultProfiles("prod");
        rootContext.register(AppConfig.class);

        // Manage the lifecycle of the root application context
        sc.addListener(new ContextLoaderListener(rootContext));
    }
}
mcoolive
źródło
5

Możesz również rozważyć usunięcie profilu PROD i użyć @Profile („! Demo”)

blacelle
źródło
2
Przypuszczam, że to nie zadziała, jeśli masz więcej niż dwa profile, prawda?
Chop
3

O ustawieniu domyślnego profilu produkcyjnego zamieściłem już @andih

Najłatwiejszym sposobem ustawienia domyślnego profilu dla wtyczki maven jetty jest dołączenie poniższego elementu do konfiguracji wtyczki:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <configuration>
        <systemProperties>
            <systemProperty>
                <name>spring.profiles.active</name>
                <value>demo</value>
            </systemProperty>
        </systemProperties>
    </configuration>
</plugin>
Jakub Kubryński
źródło
3

Sprężyna zapewnia dwie oddzielne właściwości podczas określania, które profile są aktywne:

  • spring.profiles.active

i

  • spring.profiles.default

Jeśli spring.profiles.activejest ustawiona, to jej wartość określa, które profile są aktywne. Ale jeśli spring.profiles.activenie jest ustawione, wygląda na to Wiosnaspring.profiles.default.

Jeśli żadna z nich spring.profiles.activenie spring.profiles.defaultjest ustawiona, nie ma aktywnych profili i tworzone są tylko te komponenty bean, które nie są zdefiniowane jako znajdujące się w profilu. Każdy komponent bean, który nie określa profilu, należy do defaultprofilu.

Touhidur Rahaman Khan
źródło
-1

Możesz skonfigurować swój web.xml jako filtrowany zasób i mieć tę wartość wypełnioną przez maven z ustawień profilu maven - to właśnie robimy.

w pom filtruj wszystkie zasoby (możesz to zrobić, jeśli nie masz w nich oznaczenia $ {})

<webResources>
    <resource>
        <directory>src/main/webapp</directory>
        <filtering>true</filtering>
    </resource>
</webResources>

w web.xml umieścić

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>${spring.prfile}</param-value>
</context-param>

w pom stworzyć profile maven

<profiles>
    <profile>
        <id>DEFAULT</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profile>prod</spring.profile>
        </properties>
    <profile>
    <profile>
        <id>DEMO</id>
        <properties>
            <spring.profile>demo</spring.profile>
        </properties>
    <profile>
</profiles>

Teraz możesz użyć

mvn jetty:run -P DEMO

lub po prostu za -P DEMOpomocą dowolnego polecenia mavena

Hurda
źródło
1
Nie jestem pewien, ale myślę, że to nie zadziała. Molo IMHO: uruchomienie nie będzie działać w fazie, w której zasoby są filtrowane.
Michał Margiel
z caurse, musisz uruchomić mvn clean compile jetty: run -P DEMO, ale z nieskompilowanym kodem uruchamia go automatycznie
Hurda
10
Rozumiem, że jednym z głównych celów profili Spring 3.1 jest wygenerowanie jednego pliku WAR gotowego do wdrożenia we wszystkich środowiskach. Korzystanie z profili Maven to krok wstecz do poprzedniego stanu: gdzie pakowanie pliku WAR było potrzebne dla każdego środowiska ...
edrabc
@edrabc pytał o mvn jetty: run - nie ma pliku WAR.
Hurda
Zgadzam się @Hurda. Ale prosił również o uruchomienie polecenia w wielu środowiskach: mieszanie profili Maven i profili sprężynowych może być nieco mylące ...
edrabc