Làm thế nào để giữ cho các cấu hình Maven đang hoạt độngByDefault hoạt động ngay cả khi một cấu hình khác được kích hoạt?


113

Tôi có một hồ sơ trong pom.xml của mình, hồ sơ này sẽ luôn hoạt động trừ khi nó bị hủy kích hoạt rõ ràng (-P! FirstProfile). Tôi đã giải quyết vấn đề này bằng cách sử dụng cờ activeByDefault:

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

Bây giờ trong cùng một pom.xml, tôi có một cấu hình thứ hai được xác định, cấu hình này chỉ hoạt động nếu cấu hình thực sự được kích hoạt (-P secondProfile). Vì vậy, hành vi mặc định là: firstProfile hoạt động, secondProfile không hoạt động. Tại một số điểm khác, tôi muốn kích hoạt cấu hình thứ hai ngoài cấu hình đầu tiên. Bây giờ vấn đề là nếu tôi làm điều đó với "-P secondProfile" thì firstProfile không may bị vô hiệu hóa. Tài liệu Maven cho biết điều này:

... Cấu hình này sẽ tự động hoạt động cho tất cả các bản dựng trừ khi một cấu hình khác trong cùng một POM được kích hoạt bằng một trong các phương pháp được mô tả trước đó. Tất cả các cấu hình đang hoạt động theo mặc định sẽ tự động vô hiệu hóa khi một cấu hình trong POM được kích hoạt trên dòng lệnh hoặc thông qua cấu hình kích hoạt của nó. ...

Có cách nào đó có khả năng làm thế nào để giữ cho firstProfile luôn hoạt động (mà không cần phải khai báo nó trong settings.xml) không?


Câu trả lời:


153

Một mẹo nhỏ là tránh activeByDefaultvà thay vào đó kích hoạt cấu hình bằng cách không có thuộc tính, ví dụ:

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

Sau đó, bạn có thể hủy kích hoạt cấu hình bằng -DskipFirstProfile hoặc bằng -P !firstProfile, nhưng nếu không, cấu hình sẽ hoạt động.

Xem: Maven: Tài liệu tham khảo đầy đủ, Kích hoạt hồ sơ - Kích hoạt khi không có thuộc tính


Trong những trường hợp nào thì điều này hữu ích hoặc tốt hơn là đề cập rõ ràng về bản thân tiểu sử? tức là thay vì chuyển vào -DmyFlag tôi có thể làm -PmyDefaultProfile đúng không? Có lợi ích gì khi kiểm soát nó bằng một cờ mà tôi đang thiếu không?
Chetya

1
Vì cấu hình sẽ tự động hoạt động khi cờ không có ở đó. Hồ sơ firstProfilechỉ bị vô hiệu nếu bạn chỉ định -DskipFirstProfile(ví dụ mvn verify -DskipFirstProfile).
seanf

25

Tôi ước có một khả năng như vậy, tôi đã thường xuyên bỏ lỡ nó. Vấn đề JIRA có liên quan duy nhất mà tôi có thể tìm thấy là:

MNG-4917: Cấu hình không hoạt động mặc dù nó đã đặt activeByDefault thành true

Và nó đã được giải quyết như Not A Problem.

Tôi đã ngừng sử dụng activeByDefaultvì cách tiếp cận "tất cả hoặc không có gì" này khiến nó trở nên vô giá trị đối với tôi.


Cách duy nhất để thay đổi hành vi này là viết thay thế của riêng bạn cho DefaultProfileSelector, đăng ký nó như một thành phần đám rối với @Component( role = ProfileSelector.class )và đặt nó vào ${MAVEN_HOME}/lib/ext(theo cách đó nó sẽ được chọn làm bộ chọn cấu hình mặc định). (Nếu bạn đang sử dụng Maven 3.0.2 trở lên, bạn cũng sẽ phải chỉnh sửa ${MAVEN_HOME}/bin/m2.confđể tải lib/exttrước khi tải lib)


Một lựa chọn tốt-to-have thay thế sẽ là profile-kế thừa hoặc profile-decorator, cho phép sử dụng lại các cấu hình cơ sở.
crowne

@crowne chắc chắn rồi. Tại sao không đề xuất điều đó như một yêu cầu tính năng?
Sean Patrick Floyd

Đây là loại liên quan ... Một điều tôi muốn làm là thêm tất cả các mô-đun vào một cấu hình hoạt động theo mặc định vì tôi nghĩ rằng không có cách nào để xóa một mô-đun khỏi thực thi. Trong 3.2.1 họ đã thêm điều này như được hiển thị ở đây . Tôi để lại nhận xét này trong trường hợp ai đó tình cờ ở đây và đang sử dụng các mô-đun vì lý do tương tự như tôi.
Captain Man

10

Câu hỏi này rất cổ, nhưng có vẻ như vấn đề có thể giải quyết được bằng cách sử dụng activeProfilechứ không phải activeByDefault. Tôi đang sử dụng Maven 3.3.9, nhưng giải pháp có thể hoạt động trên các phiên bản trước đó.

Đơn giản chỉ cần liệt kê ra activeProfilestrong của bạn settings.xml, như vậy:

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

Trong my-awesome-profiletôi có các cài đặt như URL cơ sở dữ liệu, v.v., vì vậy chúng luôn được áp dụng. Ở đây, tôi kích hoạt một cấu hình thứ hai, 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)

Chú ý làm thế nào my-awesome-profilevẫn còn hoạt động. Yay!


4

Bạn chỉ cần liệt kê tất cả các cấu hình bạn muốn kích hoạt trên dòng lệnh như sau:

-P hồ sơ-1, hồ sơ-2

maven được thiết kế để cho phép tự động kích hoạt nhiều cấu hình, nếu bạn ghi đè điều đó bằng -P thì chỉ những cấu hình được liệt kê trong tham số mới được kích hoạt.


7
Điều đó không hoàn toàn đúng. Kích hoạt hồ sơ theo cách thủ công với -Pchỉ hủy kích hoạt <activeByDefault>hồ sơ. Các cấu hình được kích hoạt bởi <activeProfiles>trong settings.xmlhoặc bằng bất kỳ loại nào khác <activation>vẫn hoạt động trừ khi bị hủy kích hoạt một cách rõ ràng.
Sam Hanes

4

Hồ sơ là một cách tốt để đưa một số thứ tự vào POM. Đặc biệt nếu bạn sử dụng nhiều lần thực thi cùng một plugin cho các mục đích khác nhau.

Sử dụng tệp:

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

Điều này sẽ luôn đúng (trừ khi ai đó xóa thư mục trong khi khởi động Maven :). Đã thử nghiệm với Maven 3.6.0.

Nó cũng có thể là một cách tốt để phân biệt giữa các loại dự án. Ví dụ, dự án của tôi luôn module.jsoncó mặt.

Sử dụng tiện ích mở rộng kích hoạt hồ sơ

Có một số tiện ích mở rộng Maven để kích hoạt hồ sơ. Một trong số chúng trong một ngã ba tại đây:
https://github.com/OndraZizka/el-profile-activator-extension


1
điều chỉnh nhỏ có vẻ là<file><exists>.</exists></file>
revau.lt

-1

Bạn không thể giữ cho hồ sơ mặc định hoạt động, nhưng bạn có thể lấy nội dung của hồ sơ đó (... trong ví dụ của bạn) và chỉ cần di chuyển nó vào phần chính của pom.

Chỉ vì bạn đang sử dụng hồ sơ, không có nghĩa là mọi thứ bạn đang làm đều cần nằm trong hồ sơ.


Điều này không trả lời câu hỏi - OP tuyên bố rõ ràng rằng cấu hình phải "luôn hoạt động trừ khi nó bị hủy kích hoạt rõ ràng". Có lẽ đôi khi cần phải tắt nó một cách rõ ràng, điều mà câu trả lời này không cho phép.
sleske
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.