Sự phụ thuộc khác nhau cho các cấu hình xây dựng khác nhau


115

Có thể có một tập hợp phụ thuộc khác nhau trong tệp maven pom.xml cho các cấu hình khác nhau không?

ví dụ

mvn -P debug
mvn -P release

Tôi muốn chọn một tệp jar phụ thuộc khác trong một hồ sơ có cùng tên lớp và cách triển khai khác nhau của cùng một giao diện.


Điều này có thể được sử dụng khi nhắm mục tiêu các máy chủ web khác nhau. Ví dụ: khi xây dựng một máy chủ JavaEE 5, cung cấp các lib như JAXB, mà bạn không nên đưa vào tệp war của mình, so với xây dựng cho máy chủ JavaEE 1.4, nơi bạn nên bao gồm jar JAXB.
Leonel

Câu trả lời:


174

Để trích dẫn tài liệu Maven về điều này :

Phần tử hồ sơ chứa cả kích hoạt tùy chọn (trình kích hoạt hồ sơ) và tập hợp các thay đổi sẽ được thực hiện đối với POM nếu hồ sơ đó đã được kích hoạt. Ví dụ: một dự án được xây dựng cho môi trường thử nghiệm có thể trỏ đến một cơ sở dữ liệu khác với cơ sở dữ liệu của lần triển khai cuối cùng. Hoặc các phụ thuộc có thể được lấy từ các kho khác nhau dựa trên phiên bản JDK được sử dụng .

(Nhấn mạnh là của tôi)

Chỉ cần đặt phụ thuộc cho releasehồ sơ bên trong chính khai báo hồ sơ và thực hiện tương tự cho debug.

<hồ sơ>
    <hồ sơ>
        <id> gỡ lỗi </id>
        …
        <phụ thuộc>
            <dependency>… </dependency>
        </dependencies>
        …
    </profile>
    <hồ sơ>
        <id> phát hành </id>
        …
        <phụ thuộc>
            <dependency>… </dependency>
        </dependencies>
        …
    </profile>
</profiles>

2
Phương pháp này sẽ khiến mã không được giải quyết trong chế độ chỉnh sửa. Nếu gỡ lỗi đang hoạt động, bình phát hành phụ thuộc sẽ bị thiếu và mã sẽ bị lỗi. Làm thế nào để giải quyết nó?
brucenan

6
bạn có thể đặt phạm vi phụ thuộc của bản phát hành cụ thể là 'được cung cấp' trong phân cấp phụ thuộc và đặt lại phạm vi thành 'biên dịch' trong phần hồ sơ phát hành. Vì vậy, sự phụ thuộc có sẵn cho việc biên dịch nhưng không có trong cuộc chiến cuối cùng cho hồ sơ 'gỡ lỗi'.
Uday

@uday Nếu bạn muốn đặt một câu trả lời cho thấy cách tiếp cận đó, tôi rất muốn tán thành nó
javadba

Hồ sơ IMHO là vô dụng, ít nhất là đối với các phần phụ thuộc: IDE đưa ra lỗi, các phần phụ thuộc ngừng phân giải, các ứng dụng cuối cùng không hoạt động. Tôi đã mong đợi nhiều hơn nữa.
Ares

6

NhómId, ArtifactId của bạn nên được mã hóa trong hồ sơ của bạn dưới dạng thuộc tính và bạn có thể di chuyển các phần phụ thuộc của mình sang phần chung.


2
Điều này sẽ chỉ xảy ra nếu bạn có 1 người phụ thuộc. Nếu số lượng phụ thuộc khác nhau giữa gỡ lỗi và phát hành, mã thông báo sẽ không hoạt động. Đối với vấn đề đó, tôi khuyên bạn không nên mã hóa và xác định rõ ràng các nhiệm vụ trong phần hồ sơ.
Marcel Overdijk,

Câu trả lời khác không phù hợp với tôi, vì các phụ thuộc cấu hình mặc định vẫn được bao gồm cùng với các phụ thuộc cấu hình cụ thể khác. Câu trả lời của bạn hoạt động tốt.
Vlad Mihalcea

@Vlad Bạn đã xóa phần phụ thuộc khỏi phần chính của POM chưa? Nếu không, bạn sẽ có nó hai lần. (Xem stackoverflow.com/q/24855678/6944068 về làm thế nào để đảm bảo một hồ sơ cá nhân luôn được kích hoạt.)
toolforger
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.