İlkbahar 3.1'deki varsayılan profil


100

Başvurumda @Profile("prod")ve açıklamalı fasulye var @Profile("demo"). İlki, tahmin edebileceğiniz gibi :), üretim DB'sine bağlanan fasulyelerde kullanılır ve ikincisi HashMap, geliştirmeyi daha hızlı hale getirmek için bazı sahte DB ( veya her neyse) kullanan fasulyelere açıklama ekler .

Sahip olmak istediğim şey"prod" , " başka bir şey " tarafından geçersiz kılınmadıysa her zaman kullanılacak olan varsayılan profildir ( ) .

Benim içimde olması mükemmel olurdu web.xml:

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

ve sonra -Dspring.profiles.active="demo"bunu yapabilmem için geçersiz kıl :

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

Ama ne yazık ki bu işe yaramıyor. Bunu nasıl başarabileceğime dair bir fikrin var mı? -Dspring.profiles.active="prod"Tüm ortamlarımı ayarlamak bir seçenek değil.

Yanıtlar:


67

Benim deneyimim kullanmak

@Profile("default")

fasulye yalnızca başka bir profil tanımlanmadıysa içeriğe eklenir. Farklı bir profilden geçerseniz, örneğin -Dspring.profiles.active="demo"bu profil yok sayılır.


4
Kabul edilen yanıt web.xml'ye bağlıdır (ve bu iyi), ancak bu yanıt web.xml'iniz olup olmadığına bakılmaksızın işe yarar ve bu nedenle herkes için daha genel olarak yararlıdır.
Jay

1
bu çözüm çok daha temiz
cahen

Bu resmi bir özellik mi yoksa bir yan etki mi? Bu özelliğin açıklandığı Bahar belgelerine bağlantı vermek ister misiniz?
rustyx

111

Üretim ortamınızı web.xml dosyanızda varsayılan profil olarak tanımlayın

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

ve farklı bir profil kullanmak istiyorsanız bunu sistem özelliği olarak geçirin

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

3
Hayır, aktif profili web.xml'de ve sistem özelliği olarak tanımlamaya çalıştı . Çözümümde web.xml'de varsayılan bir profil yapılandırıyorum ve sistem özelliği aracılığıyla etkin profilin üzerine yazıyorum / tanımlıyorum . Açık bir aktif profil yoksa, varsayılan kullanılır.
andih

1
Teşekkürler! tam da istediğim buydu! hiçbir yerde bulamadı: /
Michał Margiel

Bu yaklaşım bir sorun: Eğer ayarlarsanız spring.profiles.default=prodiçinde application.properties, daha sonra application-prod.propertiesyüklenen edilmeyecektir. Bu sezgiye aykırıdır.
gamliela

@gamliela Yaklaşım bir application.propertiesdosyada varsayılan profili ayarlamaz . Bunun application-prod.propertieskullanılması gerektiğini bilmek için profili bilmeniz gerekir. Bu yaklaşımın yaptığı şey budur. Yay bağlamı dışındaki profilleri web.xml(varsayılan) veya ortam değişkeni aracılığıyla (varsayılanın üzerine yazın) tanımlar .
andih

@andih Evet, bunu biliyorum ama sadece sezgisel olmadığını ve dolayısıyla sorunlu olduğunu söylüyorum. application-default.propertiesYüklendiğinden beri , bunun da yüklenmesini bekliyorum application-newdefault.properties. Çözümünüzle ilgili bir sorun değil, Bahar ile ilgili bir sorun ...
gamliela

6

Aynı sorunu yaşıyorum, ancak ServletContext'i program aracılığıyla yapılandırmak için WebApplicationInitializer kullanıyorum (Servlet 3.0+). Bu yüzden aşağıdakileri yapıyorum:

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));
    }
}

5

PROD profilini kaldırmayı ve @Profile ("! Demo") kullanmayı da düşünebilirsiniz.


2
Sanırım ikiden fazla profiliniz varsa bu işe yaramaz, değil mi?
doğrayın

3

@Andih zaten yayınlanan varsayılan üretim profilini ayarlama hakkında

Maven jetty eklentisi için varsayılan profili ayarlamanın en kolay yolu, eklenti yapılandırmanıza aşağıdaki öğeyi eklemektir:

<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>

3

Yay, hangi profillerin aktif olduğunu belirlerken iki ayrı özellik sağlar:

  • spring.profiles.active

ve

  • spring.profiles.default

Eğer spring.profiles.activeayarlanır, daha sonra değeri profilleri aktif olduğunu belirler. Ama spring.profiles.activeayarlanmadıysa, o zaman Baharspring.profiles.default.

Hiçbiri ayarlanmadıysa spring.profiles.activeveya spring.profiles.defaultayarlanmadıysa, etkin profil yoktur ve yalnızca bir profilde tanımlanmayan çekirdekler oluşturulur default. Profil belirtmeyen her fasulye profile aittir .


-1

Web.xml dosyanızı filtrelenmiş kaynak olarak kurabilir ve bu değeri maven profil ayarlarından maven tarafından doldurabilirsiniz - biz de bunu yaparız.

pom'da tüm kaynakları filtreleyin (üzerinde $ {} işareti yoksa yapabilirsiniz)

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

web.xml içine

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

pom'da maven profilleri oluştur

<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>

Şimdi kullanabilirsin

mvn jetty:run -P DEMO

veya -P DEMOherhangi bir maven komutuyla


1
Emin değilim ama bunun işe yaramayacağını düşünüyorum. IMHO jetty: run, kaynakların filtrelendiği aşamayı çalıştırmaz.
Michal Margiel

caurse Eğer mvn temiz derleme iskeleye çalıştırmak gerekir: -P DEMO çalıştırabilir, ancak derlenmemiş kod ile bunu autimaticly o ishal
Hurda

10
Spring 3.1 Profillerinin ana hedeflerinden birinin tüm ortamlarda konuşlandırılmaya hazır tek bir WAR dosyası oluşturmak olduğunu anlıyorum. Maven profillerini kullanmak önceki duruma geri adım
atmaktır

@edrabc mvn iskelesi istiyordu: run - WAR dosyası yok.
Hurda

Kabul ediyorum @Hurda. Ama aynı zamanda komutu birden fazla ortamda çalıştırmayı da istiyordu: Maven Profilleri ve Yay Profillerinin bir karışımına sahip olmak biraz yanıltıcı olabilir ...
edrabc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.