Başka bir profil etkinleştirilse bile activeByDefault olan Maven profilleri nasıl aktif tutulur?


113

Pom.xml dosyamda, açıkça devre dışı bırakılmadığı sürece her zaman etkin olması gereken bir profilim var (-P! FirstProfile). Bunu activeByDefault bayrağını kullanarak çözdüm:

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    ...
  </profile>
</profiles>

Şimdi aynı pom.xml'de ikinci bir profil tanımladım, bu yalnızca profil gerçekten etkinleştirildiyse etkin olmalıdır (-P secondProfile). Dolayısıyla, varsayılan davranış şudur: firstProfile active, secondProfile inactive. Başka bir noktada, birinci profile ek olarak ikinci profili de etkinleştirmek istiyorum. Şimdi sorun şu ki, bunu "-P secondProfile" ile yaparsam, birinciProfile maalesef devre dışı kalıyor. Maven dokümantasyonu şunu belirtir:

... Bu profil, daha önce açıklanan yöntemlerden biri kullanılarak aynı POM'daki başka bir profil etkinleştirilmediği sürece tüm yapılar için otomatik olarak etkin olacaktır. Varsayılan olarak etkin olan tüm profiller, POM'daki bir profil komut satırında etkinleştirildiğinde veya etkinleştirme yapılandırması aracılığıyla otomatik olarak devre dışı bırakılır. ...

FirstProfile'ı her zaman etkin tutmak için bir olasılık var mı (settings.xml'de bildirmek zorunda kalmadan)?


Yanıtlar:


153

Bir püf noktası, kaçınmak activeByDefaultve bunun yerine bir mülkün yokluğunda profili etkinleştirmektir, örneğin:

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <property>
        <name>!skipFirstProfile</name>
      </property>
    </activation>
    ...
  </profile>
</profiles>

Daha sonra ile -DskipFirstProfile veya ile profili devre dışı bırakabilmelisiniz -P !firstProfile, ancak aksi takdirde profil aktif olacaktır.

Bakınız: Maven: Tam Referans, Profil Etkinleştirme - Bir Özelliğin Olmaması Yoluyla Etkinleştirme


Bu hangi koşullar altında yararlıdır veya profilin kendisinden açıkça bahsetmekten daha iyidir? Yani -DmyFlag'e geçmek yerine -PmyDefaultProfile hakkını kullanabilirim, eksik olduğum bir bayrakla kontrol etmenin herhangi bir faydası var mı?
Chetya

1
Profil, bayrak olmadığında otomatik olarak aktif olduğu için . Profil firstProfile, yalnızca belirtirseniz devre dışı bırakılır -DskipFirstProfile(örn. mvn verify -DskipFirstProfile).
seanf

25

Keşke böyle bir olasılık olsaydı, sık sık kaçırdım. Bulabildiğim tek ilgili JIRA sorunu şudur:

MNG-4917: activeByDefault true olarak ayarlanmış olmasına rağmen profil etkin değil

Ve olarak çözüldü Not A Problem.

Kullanmayı bıraktım activeByDefault, çünkü bu "ya hep ya hiç" yaklaşımı onu benim için değersiz hale getirdi.


Bu davranışı değiştirmenin tek yolu, yerine kendi yerine koyduğunuz yeri yazmak DefaultProfileSelector, onu bir pleksus bileşeni olarak kaydetmek @Component( role = ProfileSelector.class )ve yerleştirmektir ${MAVEN_HOME}/lib/ext(bu şekilde, varsayılan profil seçici olarak seçilecektir). (Maven 3.0.2 veya daha eski bir sürümü kullanıyorsanız ${MAVEN_HOME}/bin/m2.conf, yüklemeden lib/extönce yüklemek için düzenlemeniz de gerekecektir lib)


Sahip olması hoş bir alternatif, profil devralma veya profil dekoratörleri olabilir ve temel yapılandırmaların yeniden kullanılmasına izin verir.
crowne

@crowne kesinlikle, evet. Neden bunu bir özellik isteği olarak önermiyorsunuz?
Sean Patrick Floyd

Bu biraz ilgili ... Yapmaktan hoşlandığım bir şey, tüm modülleri varsayılan olarak aktif bir profile eklemek çünkü bir modülü yürütmeden kaldırmanın bir yolu olmadığını düşündüm. 3.2.1'de bunu burada gösterildiği gibi eklediler . Birinin burada tökezlemesi ve modülleri bana benzer bir nedenle kullanması durumunda bu yorumu bırakıyorum.
Captain Man

10

Bu soru eskidir, ancak sorunun activeProfileyerine kullanarak çözülebileceği anlaşılıyor activeByDefault. Maven 3.3.9 kullanıyorum, ancak çözüm önceki sürümlerde çalışabilir.

Basitçe kendi listenizde activeProfilesyer alın settings.xml, şöyle:

<settings>
  <profiles>
    [...]
  </profiles>
  <activeProfiles>
    <activeProfile>my-awesome-profile</activeProfile>
  </activeProfiles>
</settings>

Gelen my-awesome-profilebu kadar I, vb veritabanı URL'ler gibi ayarlara sahip ve her zaman geçerlidir. Burada ikinci bir profili etkinleştiriyorum resolve-from-central:

$ mvn help:all-profiles -P resolve-from-central 
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-help-plugin:2.2:all-profiles (default-cli) @ standalone-pom ---
[INFO] Listing Profiles for Project: org.apache.maven:standalone-pom:pom:1
  Profile Id: resolve-from-central (Active: true , Source: settings.xml)
  Profile Id: my-awesome-profile (Active: true , Source: settings.xml)
  Profile Id: resolve-from-internal (Active: false , Source: settings.xml)

Nasıl my-awesome-profilehala aktif olduğuna dikkat edin . Yaşasın!


4

Etkinleştirmek istediğiniz tüm profilleri komut satırında şu şekilde listeleyebilirsiniz:

-P profil-1, profil-2

maven, birden fazla profilin otomatik olarak etkinleştirilmesine izin verecek şekilde tasarlanmıştır, ancak bunu -P ile geçersiz kılarsanız, yalnızca parametrede listelenen profiller etkinleştirilir.


7
Bu tamamen doğru değil. -PYalnızca <activeByDefault>profilleri devre dışı bırakan profilleri manuel olarak etkinleştirmek . İle aktive Profilleri <activeProfiles>içinde settings.xmlveya başka tür tarafından <activation>açıkça devre dışı sürece aktif kalır.
Sam Hanes

4

Profiller, POM'a biraz düzen getirmenin iyi bir yoludur. Özellikle aynı eklentinin birden çok uygulamasını farklı amaçlar için kullanıyorsanız.

Dosyaları kullanma:

<profile>
    <id>alwaysActive</id>
    <activation>
         <file><exists>.</exists></file>
    </activation>
    ...
</profile>

Bu her zaman doğru olacaktır (Maven açılışı sırasında birisi dizini silmediği sürece :). Maven 3.6.0 ile test edilmiştir.

Ayrıca, proje türlerini ayırt etmenin iyi bir yolu olabilir. Mesela benim projem her zaman module.jsonvar oldu.

Profil etkinleştiren bir uzantı kullanma

Profil aktivasyonu için birkaç Maven uzantısı vardır. Bunlardan biri burada çatalda:
https://github.com/OndraZizka/el-profile-activator-extension


1
küçük bir düzeltme gibi görünüyor<file><exists>.</exists></file>
revau.lt

-1

Varsayılan profili aktif tutamazsınız, ancak bu profilin içeriğini (örneğinizde ...) alıp sadece pomun ana bölümüne taşıyabilirsiniz.

Profilleri kullanıyor olmanız, yaptığınız her şeyin bir profil içinde olması gerektiği anlamına gelmez.


Bu soruya yanıt vermez - OP, profilin "açıkça devre dışı bırakılmadıkça her zaman aktif" olması gerektiğini açıkça belirtir. Muhtemelen bazen bu cevabın izin vermediği açık bir şekilde devre dışı bırakma ihtiyacı vardır.
sleske
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.