Làm thế nào để chỉ định tổ chức phân phối của maven trên toàn bộ?


110

Tôi đang cố gắng tìm ra cách tổ chức nhiều (khoảng hơn 50) dự án maven2, để chúng có thể triển khai thành một kho lưu trữ mối quan hệ trung tâm. Khi sử dụng mvn deploymục tiêu, người ta cần chỉ định mục tiêu trong thẻ phân phối như sau:

<distributionManagement>
   <repository>
      <id>nexus-site</id>
        <url>http://central_nexus/server</url>
   </repository>
</distributionManagement>

Bây giờ, tôi không muốn mọi pom.xml (trong số 50+ đó) phải chứa khối này lặp đi lặp lại. Mặc dù đầu tiên của tôi sẽ là settings.xmltệp, nhưng có vẻ như không thể (theo thiết kế) để xác định nó ở đó. Vì vậy, câu hỏi đầu tiên sẽ là, tại sao lại như vậy? Nếu có thể, tôi có thể chỉ định nó trong settings.xml trong bản phân phối maven2, bản phân phối này có thể được phân phối cho tất cả các nhà phát triển.

Giải pháp khả thi duy nhất mà tôi đã tìm thấy là tạo một dự án master-pom trong toàn tổ chức, có chứa các cài đặt này và làm cho tất cả các pom.xml khác phụ thuộc vào master-pom thông qua <parent>thẻ này. Nhưng điều này trông hơi lạ trong các bản dựng nhiều mô-đun:

- master configuration POM (pm)
- Project 1 parent pom (p1 with module 1 and module 2 as modules)
    - Project 1 module pom (with pm as parent)
    - Project 2 module pom (with pm as parent)

Thông thường tôi đọc trong tất cả các tài liệu rằng các mô-đun pom nên sử dụng pom mẹ, chứ không phải một số khác. Nhưng sau khi đọc trang web maven về Inheritance v. Tổng hợp, người ta viết rằng nó thực sự có thể.

Một vấn đề tôi tìm thấy là với việc tạo trang web maven, có vẻ như có vấn đề với thiết lập này (các mô-đun không được liên kết chính xác nếu chúng không có tham chiếu ngược trực tiếp)

Vì vậy, đây có phải là một cách tiếp cận hợp lệ? Bất kỳ giải pháp khác, rõ ràng hơn, đơn giản hơn cho vấn đề?



5
@OhadR: Họ chỉ viết cách viết nó trong một dự án. Vấn đề là tôi không muốn lặp lại nó khoảng 500 lần ...
mglauche

1
tôi hiểu rồi. lấy điểm. như vậy là một trong những người trả lời nói, bạn có thể có một pom chính cho dự án, mà sẽ chứa 'distribMngmnt' ...
OhadR

Câu trả lời:


144

Giải pháp tốt nhất cho điều này là tạo một dự án tệp pom mẹ đơn giản (với đóng gói 'pom') nói chung cho tất cả các dự án từ tổ chức của bạn.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>your.company</groupId>
    <artifactId>company-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <distributionManagement>
        <repository>
            <id>nexus-site</id>
            <url>http://central_nexus/server</url>
        </repository>
    </distributionManagement>

</project>

Điều này có thể được xây dựng, phát hành và triển khai cho mối quan hệ địa phương của bạn để mọi người đều có quyền truy cập vào tạo tác của nó.

Bây giờ cho tất cả các dự án mà bạn muốn sử dụng nó, chỉ cần bao gồm phần này:

<parent>
  <groupId>your.company</groupId>
  <artifactId>company-parent</artifactId>
  <version>1.0.0</version>
</parent>

Giải pháp này sẽ cho phép bạn dễ dàng thêm những thứ thông thường khác vào tất cả các dự án của công ty bạn. Ví dụ: nếu bạn muốn chuẩn hóa việc sử dụng JUnit của mình thành một phiên bản cụ thể, đây sẽ là nơi hoàn hảo cho việc đó.

Nếu bạn có các dự án sử dụng cấu trúc đa mô-đun có cha mẹ của chúng, Maven cũng hỗ trợ kế thừa chuỗi, vì vậy hoàn toàn có thể chấp nhận được việc đặt tệp pom mẹ của dự án của bạn tham chiếu đến pom mẹ của công ty bạn và có các mô-đun con của dự án thậm chí không biết về công ty mẹ.

Tôi thấy từ cấu trúc dự án mẫu của bạn rằng bạn đang cố gắng đặt dự án mẹ của mình ở cùng cấp với trình tổng hợp của bạn. Nếu dự án của bạn cần cha mẹ của nó, thì cách tốt nhất mà tôi đã tìm thấy là bao gồm cha mẹ ở cùng cấp với phần còn lại của các mô-đun và có tệp pom.xml tổng hợp của bạn ở gốc nơi tất cả các thư mục của mô-đun của bạn tồn tại.

- pom.xml (aggregator)
    - project-parent
    - project-module1
    - project-module2

Những gì bạn làm với cấu trúc này là bao gồm mô-đun mẹ của bạn trong trình tổng hợp và xây dựng mọi thứ với một mvn installtừ thư mục gốc.

Chúng tôi sử dụng giải pháp chính xác này tại tổ chức của tôi và nó đã vượt qua thử thách của thời gian và hoạt động khá tốt cho chúng tôi.


Đây là một câu trả lời khác trong đó tôi mô tả kế thừa dự án chi tiết hơn và cách quản lý sự phức tạp kế thừa của nó, xin thứ lỗi cho cách chơi chữ. ;) stackoverflow.com/questions/6347913
Jesse Webb

7
Chỉ cần một lưu ý nhỏ: để biết lý do tại sao công ty mẹ là giải pháp tốt nhất, hãy xem phần thảo luận Không thể chỉ định phân phối Quản lý trong settings.xml từ danh sách người dùng Maven.
Premek Brada

Trong mô hình tư vấn cổ điển, trong đó "khách hàng sở hữu mã", nhóm phát triển của tôi sẽ cần làm việc trên trang web của dự án, sau đó lấy mã mới nhất đến trang web của khách hàng và xây dựng lại. Trong tình huống của tôi, đang làm việc với một dự án nhiều mô-đun, nếu tôi tham chiếu POM của công ty trong POM mẹ của dự án, tôi sẽ phải cập nhật tham chiếu đó để trỏ đến POM công ty của khách hàng. Tôi muốn cố gắng duy trì tất cả các cài đặt môi trường cụ thể trong settings.xml nếu tôi có thể giúp được. Cách tiếp cận được đề xuất cho tình huống của tôi là gì?
Người dùng web

2
@WebUser Vấn đề của bạn giống một tình huống mà bạn cần các giá trị khác nhau trong (các) tệp POM của mình thay vì những gì câu trả lời này giải quyết: tránh các cài đặt trùng lặp trên nhiều mô-đun. Tôi nghĩ bạn nên thử chèn các thuộc tính thông qua tệp settings.xml . Nếu điều đó không giúp được bạn, hãy đặt một câu hỏi mới tại đây trên SO, liên kết đến câu hỏi đó tại đây, và tôi sẽ cố gắng hỗ trợ bạn thêm.
Jesse Webb

Cảm ơn @JesseWebb Tôi đã thử điều đó và việc trừu tượng hóa các giá trị đó ra khỏi POM sẽ rất hữu ích cho tình huống tôi mô tả. Đối với nhu cầu của tôi, tôi đã thêm các thuộc tính có liên quan trong hồ sơ hoạt động và những thuộc tính được giải quyết trong POM.
Người dùng web

36

Không cần POM mẹ.

Bạn có thể bỏ qua phần phân phối hoàn toàn trong poms của mình và đặt nó trên máy chủ xây dựng của bạn hoặc trong settings.xml.

Để thực hiện trên máy chủ xây dựng, chỉ cần chuyển đến mvnlệnh:

-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=releases::default::https://YOUR_NEXUS_URL/releases

Xem https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html để biết chi tiết có thể đặt các tùy chọn nào.

Cũng có thể thiết lập điều này trong của bạn settings.xml.

Chỉ cần tạo một hồ sơ ở đó được kích hoạt và chứa thuộc tính.

Ví dụ settings.xml:

<settings>
[...]
  <profiles>
    <profile>
      <id>nexus</id>
      <properties>
        <altSnapshotDeploymentRepository>snapshots::default::https://YOUR_NEXUS_URL/snapshots</altSnapshotDeploymentRepository>
        <altReleaseDeploymentRepository>releases::default::https://YOUR_NEXUS_URL/releases</altReleaseDeploymentRepository>
      </properties>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>

</settings>

Đảm bảo rằng thông tin đăng nhập cho "ảnh chụp nhanh" và "bản phát hành" có trong <servers>phần settings.xml của bạn

Các thuộc tính altSnapshotDeploymentRepository và altReleaseDeploymentRepository được giới thiệu với maven-deploy-plugin phiên bản 2.8. Các phiên bản cũ hơn sẽ không thành công với thông báo lỗi

Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter

Để khắc phục điều này, bạn có thể thực thi phiên bản plugin mới hơn:

        <build>
          <pluginManagement>
            <plugins>
              <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8</version>
              </plugin>
            </plugins>
          </pluginManagement>
        </build>

Tôi liên tục thử giải pháp này nhưng chỉ thuộc tính altDeploymentRepository hoạt động. altReleaseDeploymentRepositoryaltSnapshotDeploymentRepository không được nhận dạng và tôi gặp lỗi này: Triển khai không thành công: phần tử kho lưu trữ không được chỉ định trong phần tử POM bên trong phân phối hoặc trong tham số -DaltDeploymentRepository = id :: layout :: url. Bất kỳ đề nghị sẽ giúp đỡ. Cảm ơn bạn
Shabirmean

@Shabirmean Lý do là phiên bản quá cũ của trình cắm triển khai. Tôi đã mở rộng câu trả lời của mình với một giải pháp.
Michael Wyraz 27/09/19

Vâng, tôi đã tìm ra nó. Cảm ơn bạn rất nhiều :)
Shabirmean
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.