Bagaimana cara agar profil Maven yang aktifByDefault aktif meskipun profil lain diaktifkan?

113

Saya memiliki profil di pom.xml saya yang harus selalu aktif kecuali jika dinonaktifkan secara eksplisit (-P! FirstProfile). Saya menyelesaikan ini dengan menggunakan bendera activeByDefault:

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

Sekarang di pom.xml yang sama saya memiliki profil kedua yang ditentukan ini hanya boleh aktif jika profil benar-benar diaktifkan (-P secondProfile). Jadi perilaku defaultnya adalah: firstProfile active, secondProfile inactive. Di titik lain, saya ingin mengaktifkan profil kedua selain profil pertama. Sekarang masalahnya adalah jika saya melakukan itu dengan "-P secondProfile" sayangnya firstProfile akan dinonaktifkan. Dokumentasi Maven menyatakan ini:

... Profil ini secara otomatis akan aktif untuk semua build kecuali profil lain di POM yang sama diaktifkan menggunakan salah satu metode yang dijelaskan sebelumnya. Semua profil yang aktif secara default dinonaktifkan secara otomatis saat profil di POM diaktifkan pada baris perintah atau melalui konfigurasi aktivasi. ...

Apakah ada kemungkinan bagaimana membuat firstProfile selalu aktif (tanpa harus mendeklarasikannya di settings.xml)?

Peter
sumber

Jawaban:

153

Salah satu triknya adalah menghindari activeByDefault, dan sebaliknya mengaktifkan profil dengan tidak adanya properti, misalnya:

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

Anda kemudian harus dapat menonaktifkan profil dengan -DskipFirstProfile atau dengan -P !firstProfile, tetapi jika tidak, profil akan aktif.

Lihat: Maven: Referensi Lengkap, Aktivasi Profil - Aktivasi dengan Tidak Ada Properti

seanf
sumber
Dalam keadaan apa ini membantu atau lebih baik daripada secara eksplisit menyebutkan profil itu sendiri? yaitu alih-alih meneruskan -DmyFlag saya bisa melakukan -PmyDefaultProfile kan? Apakah ada manfaat untuk mengontrolnya dengan bendera yang saya lewatkan?
Chetya
1
Karena profile aktif secara otomatis saat flag tidak ada. Profil firstProfiledinonaktifkan hanya jika Anda menentukan -DskipFirstProfile(mis mvn verify -DskipFirstProfile.).
seanf
25

Saya berharap ada kemungkinan seperti itu, saya sering melewatkannya. Satu-satunya masalah JIRA relevan yang dapat saya temukan adalah yang ini:

MNG-4917: Profil tidak aktif meskipun activeByDefault disetel ke true

Dan itu telah diselesaikan sebagai Not A Problem.

Saya telah berhenti menggunakan activeByDefault, karena pendekatan "semua atau tidak sama sekali" ini membuat saya tidak berharga.


Satu-satunya cara untuk mengubah perilaku ini adalah dengan menulis pengganti Anda sendiri DefaultProfileSelector, mendaftarkannya sebagai komponen plexus @Component( role = ProfileSelector.class )dan memasukkannya ${MAVEN_HOME}/lib/ext(dengan cara itu akan dipilih sebagai pemilih profil default). (Jika Anda menggunakan Maven 3.0.2 atau lebih lama, Anda juga harus mengedit ${MAVEN_HOME}/bin/m2.confuntuk memuat lib/extsebelum dimuat lib)

Sean Patrick Floyd
sumber
Alternatif yang bagus untuk dimiliki, adalah profile-inheritance atau profile-decorators, yang memungkinkan konfigurasi dasar digunakan kembali.
crowne
@crowne pasti, ya. Mengapa tidak menyarankan itu sebagai permintaan fitur?
Sean Patrick Floyd
Ini semacam terkait ... Satu hal yang saya suka lakukan adalah menambahkan semua modul ke profil aktif secara default karena saya pikir tidak ada cara untuk menghapus modul dari eksekusi. Di 3.2.1 mereka menambahkan ini seperti yang ditunjukkan di sini . Saya meninggalkan komentar ini jika seseorang tersandung di sini dan menggunakan modul karena alasan yang mirip dengan saya.
Captain Man
10

Pertanyaan ini kuno, tetapi tampaknya masalahnya dapat dipecahkan dengan menggunakan activeProfiledaripada activeByDefault. Saya menggunakan Maven 3.3.9, tetapi solusinya dapat berfungsi pada versi sebelumnya.

Cukup cantumkan apa yang Anda activeProfilesmiliki settings.xml, seperti:

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

Di my-awesome-profileSaya memiliki pengaturan seperti URL database dan sebagainya, jadi mereka selalu berlaku. Di sini, saya mengaktifkan profil kedua, 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)

Perhatikan bagaimana my-awesome-profilemasih aktif. Yay!

inanutshellus
sumber
4

Anda cukup mencantumkan semua profil yang ingin Anda aktifkan pada baris perintah seperti:

-P profil-1, profil-2

maven dirancang untuk memungkinkan aktivasi beberapa profil secara otomatis, namun jika Anda menimpanya dengan -P maka hanya profil yang tercantum dalam parameter yang diaktifkan.

Assem
sumber
7
Itu tidak sepenuhnya benar. Mengaktifkan profil secara manual dengan -Phanya menonaktifkan <activeByDefault>profil. Profil yang diaktifkan oleh <activeProfiles>dalam settings.xmlatau oleh jenis lain apa pun <activation>tetap aktif kecuali dinonaktifkan secara eksplisit.
Sam Hanes
4

Profil adalah cara yang baik untuk menertibkan ke POM. Terutama jika Anda menggunakan beberapa eksekusi dari plugin yang sama untuk tujuan berbeda.

Menggunakan file:

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

Ini akan selalu benar (kecuali seseorang menghapus direktori selama boot Maven :). Diuji dengan Maven 3.6.0.

Ini juga bisa menjadi cara yang baik untuk membedakan berbagai jenis proyek. Misalnya, proyek saya selalu module.jsonada.

Menggunakan ekstensi pengaktifan profil

Ada beberapa ekstensi Maven untuk aktivasi profil. Salah satunya di percabangan di sini:
https://github.com/OndraZizka/el-profile-activator-extension

Ondra Žižka
sumber
1
koreksi kecil tampaknya<file><exists>.</exists></file>
revau.lt
-1

Anda tidak dapat membiarkan profil default tetap aktif, tetapi Anda dapat mengambil konten profil itu (... dalam contoh Anda) dan hanya memindahkannya ke bagian utama pom.

Hanya karena Anda menggunakan profil, bukan berarti semua yang Anda lakukan harus ada dalam profil.

Daniel Stolz
sumber
Ini tidak menjawab pertanyaan - OP secara eksplisit menyatakan bahwa profil harus "selalu aktif kecuali jika dinonaktifkan secara eksplisit". Agaknya terkadang ada kebutuhan untuk menonaktifkannya secara eksplisit, yang tidak diizinkan oleh jawaban ini.
sleske