จะเก็บโปรไฟล์ Maven ที่ activeByDefault ไว้ได้อย่างไรแม้ว่าโปรไฟล์อื่นจะเปิดใช้งานอยู่ก็ตาม


113

ฉันมีโปรไฟล์ใน pom.xml ซึ่งควรใช้งานได้ตลอดเวลาเว้นแต่จะปิดใช้งานอย่างชัดเจน (-P! firstProfile) ฉันแก้ไขสิ่งนี้โดยใช้แฟล็ก activeByDefault:

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

ตอนนี้ใน pom.xml เดียวกันฉันมีโปรไฟล์ที่สองที่กำหนดสิ่งนี้ควรใช้งานได้ก็ต่อเมื่อเปิดใช้งานโปรไฟล์จริงๆ (-P secondProfile) ดังนั้นลักษณะการทำงานเริ่มต้นคือ: firstProfile active, secondProfile inactive ในบางจุดฉันต้องการเปิดใช้งานโปรไฟล์ที่สองนอกเหนือจากโปรไฟล์แรก ตอนนี้ปัญหาคือว่าถ้าฉันทำด้วย "-P secondProfile" firstProfile จะถูกปิดการใช้งาน เอกสาร Maven ระบุสิ่งนี้:

... โปรไฟล์นี้จะเปิดใช้งานโดยอัตโนมัติสำหรับทุกงานสร้างเว้นแต่จะเปิดใช้งานโปรไฟล์อื่นใน POM เดียวกันโดยใช้วิธีการใดวิธีหนึ่งที่อธิบายไว้ก่อนหน้านี้ โปรไฟล์ทั้งหมดที่แอ็คทีฟโดยค่าเริ่มต้นจะถูกปิดใช้งานโดยอัตโนมัติเมื่อโปรไฟล์ใน POM ถูกเปิดใช้งานบนบรรทัดคำสั่งหรือผ่านการกำหนดค่าการเปิดใช้งาน ...

มีความเป็นไปได้หรือไม่ที่จะทำให้ firstProfile ใช้งานได้ตลอดเวลา (โดยไม่ต้องประกาศใน settings.xml)


คำตอบ:


153

เคล็ดลับอย่างหนึ่งคือการหลีกเลี่ยงactiveByDefaultและเปิดใช้งานโปรไฟล์แทนโดยที่ไม่มีคุณสมบัติเช่น:

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

จากนั้นคุณควรจะสามารถปิดใช้งานโปรไฟล์ด้วย-DskipFirstProfile หรือกับ-P !firstProfileแต่ไม่เช่นนั้นโปรไฟล์จะใช้งานได้

ดู: Maven: การอ้างอิงที่สมบูรณ์การเปิดใช้งานโปรไฟล์ - การเปิดใช้งานโดยไม่มีคุณสมบัติ


สิ่งนี้มีประโยชน์หรือดีไปกว่าการกล่าวถึงโปรไฟล์อย่างชัดเจนภายใต้สถานการณ์ใด เช่นแทนที่จะส่งผ่านใน -DmyFlag ฉันสามารถทำ -PmyDefaultProfile ได้ใช่ไหมมีประโยชน์ในการควบคุมด้วยแฟล็กที่ฉันหายไปหรือไม่?
Chetya

1
เพราะรายละเอียดการใช้งานโดยอัตโนมัติเมื่อธงคือไม่ได้มี โปรไฟล์firstProfileจะปิดใช้งานก็ต่อเมื่อคุณระบุ-DskipFirstProfile(เช่นmvn verify -DskipFirstProfile)
seanf

25

ฉันหวังว่าจะมีความเป็นไปได้เช่นนี้ฉันมักจะพลาด ปัญหา JIRA เดียวที่ฉันพบคือปัญหานี้:

MNG-4917: Profile not active even though it has activeByDefault set to true

And it's been resolved as Not A Problem.

I've stopped using activeByDefault, because this "all or nothing" approach made it worthless for me.


วิธีเดียวที่จะเปลี่ยนพฤติกรรมนี้คือการเขียนการแทนที่ของคุณเองDefaultProfileSelectorลงทะเบียนเป็นส่วนประกอบช่องท้อง@Component( role = ProfileSelector.class )และใส่เข้าไป${MAVEN_HOME}/lib/ext(วิธีนี้จะถูกเลือกเป็นตัวเลือกโปรไฟล์เริ่มต้น) (หากคุณใช้ Maven 3.0.2 ขึ้นไปคุณจะต้องแก้ไข${MAVEN_HOME}/bin/m2.confเพื่อโหลดlib/extก่อนที่จะโหลดlib)


ทางเลือกที่ดีที่จะมีคือการสืบทอดโปรไฟล์หรือผู้ตกแต่งโปรไฟล์ซึ่งช่วยให้สามารถใช้การกำหนดค่าพื้นฐานได้อีกครั้ง
คราวน์

@crowne definitely, yes. Why not suggest that as a feature request?
Sean Patrick Floyd

This is sort of related... One thing I like to do it add all modules to an active by default profile because I thought there was no way to remove a module from execution. In 3.2.1 they added this as shown here. I'm leaving this comment in case someone stumbles here and is using modules for a similar reason to me.
Captain Man

10

คำถามนี้เป็นคำถามโบราณ แต่ปรากฏว่าเป็นปัญหาที่แก้ไขได้โดยการใช้มากกว่าactiveProfile activeByDefaultฉันใช้ Maven 3.3.9 แต่โซลูชันอาจใช้ได้กับเวอร์ชันก่อนหน้า

เพียงระบุรายการของคุณactiveProfilesในของคุณsettings.xmlดังนี้:

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

ในmy-awesome-profileฉันมีการตั้งค่าเช่น URL ของฐานข้อมูลและอื่น ๆ ดังนั้นจึงใช้เสมอ ที่นี่ฉันเปิดใช้งานโปรไฟล์ที่สอง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)

สังเกตว่าmy-awesome-profileยังทำงานอยู่ เย้!


4

คุณสามารถแสดงรายการโปรไฟล์ทั้งหมดที่คุณต้องการเปิดใช้งานในบรรทัดคำสั่งดังต่อไปนี้:

-P โปรไฟล์ -1, โปรไฟล์ -2

maven ได้รับการออกแบบมาเพื่อให้สามารถเปิดใช้งานหลายโปรไฟล์โดยอัตโนมัติหากคุณแทนที่ด้วย -P จะเปิดใช้งานเฉพาะโปรไฟล์ที่แสดงในพารามิเตอร์เท่านั้น


7
นั่นไม่เป็นความจริงทั้งหมด เปิดใช้งานโปรไฟล์ด้วยตนเองโดย-Pปิดใช้งาน<activeByDefault>โปรไฟล์เท่านั้น โปรไฟล์ที่เปิดใช้งานโดย<activeProfiles>ในsettings.xmlหรือโดยประเภทอื่น ๆ<activation>ยังคงใช้งานอยู่เว้นแต่จะปิดใช้งานอย่างชัดเจน
Sam Hanes

4

โปรไฟล์เป็นวิธีที่ดีในการนำคำสั่งซื้อเข้าสู่ POM โดยเฉพาะอย่างยิ่งถ้าคุณใช้การดำเนินการหลาย ๆ ปลั๊กอินเดียวกันเพื่อวัตถุประสงค์ที่แตกต่างกัน

การใช้ไฟล์:

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

สิ่งนี้จะเป็นจริงเสมอ (เว้นแต่จะมีคนลบไดเร็กทอรีระหว่างการบูต Maven :) ทดสอบด้วย Maven 3.6.0

นอกจากนี้ยังอาจเป็นวิธีที่ดีในการแยกความแตกต่างระหว่างประเภทของโครงการ ยกตัวอย่างเช่นโครงการของฉันมีเสมอmodule.jsonในปัจจุบัน

ใช้โปรไฟล์เปิดใช้งานส่วนขยาย

มีส่วนขยาย Maven บางส่วนสำหรับการเปิดใช้งานโปรไฟล์ หนึ่งในส้อมที่นี่:
https://github.com/OndraZizka/el-profile-activator-extension


1
การแก้ไขเล็กน้อยดูเหมือนจะเป็น<file><exists>.</exists></file>
revau.lt

-1

คุณไม่สามารถใช้งานโปรไฟล์เริ่มต้นได้ แต่คุณสามารถใช้เนื้อหาของโปรไฟล์นั้น (... ในตัวอย่างของคุณ) และย้ายไปที่ส่วนหลักของ pom

เพียงเพราะคุณใช้โปรไฟล์ แต่ไม่ได้หมายความว่าทุกสิ่งที่คุณกำลังทำจะต้องอยู่ในโปรไฟล์


สิ่งนี้ไม่ได้ตอบคำถาม - OP ระบุอย่างชัดเจนว่าโปรไฟล์ควร "ใช้งานได้ตลอดเวลาเว้นแต่จะปิดใช้งานโดยชัดแจ้ง" มีความจำเป็นต้องปิดการใช้งานอย่างชัดเจนในบางครั้งซึ่งคำตอบนี้ไม่อนุญาต
sleske
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.