Tạo tác Maven và đặt tên nhóm


291

Tôi hiện đang trong quá trình chuyển một số dự án từ Ant sang Maven. Tuân thủ như tôi, tôi muốn sử dụng các quy ước được thiết lập tốt để tìm groupIdartifactId, nhưng tôi không thể tìm thấy bất kỳ quy ước chi tiết nào (có một số, nhưng chúng không bao gồm các điểm tôi đang thắc mắc).

Lấy dự án này làm ví dụ, đầu tiên là gói Java: com.mycompany.teatimer

Trà hẹn giờ thực sự là hai từ, nhưng các quy ước đặt tên gói Java đã cấm việc chèn dấu gạch dưới hoặc dấu gạch nối, vì vậy tôi sẽ viết tất cả cùng nhau.

Tôi đã chọn groupIdtrùng với ID gói vì tôi nghĩ đó là một ý tưởng tốt. Là nó?

Cuối cùng, tôi phải chọn một artifactId, tôi hiện đang đi teatimer. Nhưng khi tôi xem các dự án Maven khác, họ sử dụng dấu gạch nối để phân chia các từ trong artifactIds, như thế này : tea-timer. Nhưng nó trông có vẻ kỳ lạ khi được nối với groupId:com.mycompany.teatimer.tea-timer .

Bạn sẽ làm điều này như thế nào?

Một vi dụ khac:

Tên gói hàng: com.mycompany.awesomeinhouseframework

groupId: com.mycompany.awesomeinhouseframework(?)

artifactId: awesome-inhouse-framework(?)


1
Bạn thấy nhómId được kết hợp với artifactId ở đâu? Tôi nghĩ rằng các quy ước mà bạn nêu là chính xác.
Abhinav Sarkar

2
Trên thực tế, dấu gạch dưới được cho phép trong tên gói java, xem: docs.oracle.com/javase/tutorial/java/package/namingpkgs.html
Adriaan Koster

Câu trả lời:


146

Hội nghị của bạn có vẻ hợp lý. Nếu tôi đang tìm kiếm khuôn khổ của bạn trong repo Maven, tôi sẽ tìm awesome-inhouse-framework-x.y.jartrong com.mycompany.awesomeinhouseframeworkthư mục nhóm. Và tôi sẽ tìm thấy nó ở đó theo quy ước của bạn.

Hai quy tắc đơn giản làm việc cho tôi:

  • các gói tên miền ngược cho groupId (vì nó khá độc đáo) với tất cả các ràng buộc liên quan đến tên gói Java
  • tên dự án là artifactId (lưu ý rằng nó phải thân thiện với tên jar tức là không chứa các ký tự có thể không hợp lệ cho tên tệp hoặc trông lạ)

Được rồi, nếu bạn và abhin4v nghĩ rằng đó là bình thường, thì tôi sẽ làm như vậy, cảm ơn bạn!
Noarth

Tôi tìm thấy sự pha trộn giữa không gạch nối (awesomeinhouseframework) và gạch nối (awesome-Street-framework) đánh vần hơi lạ. Vì groupid không cho phép dấu gạch nối, tôi cũng sẽ sử dụng chính tả không gạch nối cho artifactid.
Michael Küller

3
Hãy làm rõ những gì bạn có nghĩa là "thân thiện với tên jar"?
vikramvi

1
Làm rõ trong câu trả lời :).
Henryk Konsek

241

Kỳ lạ là rất chủ quan, tôi chỉ đề nghị làm theo khuyến nghị chính thức:

Hướng dẫn đặt tên cho các quy ước trên groupId, artifactId và phiên bản

  • groupIdsẽ xác định duy nhất dự án của bạn trên tất cả các dự án, vì vậy chúng tôi cần thực thi một lược đồ đặt tên. Nó phải tuân theo các quy tắc tên gói, điều đó có nghĩa là ít nhất phải là một tên miền bạn kiểm soát và bạn có thể tạo nhiều nhóm con như bạn muốn. Nhìn vào Thông tin thêm về tên gói .

    ví dụ. org.apache.maven,org.apache.commons

    Một cách tốt để xác định mức độ chi tiết của groupId là sử dụng cấu trúc dự án. Đó là, nếu dự án hiện tại là một dự án nhiều mô-đun, nó sẽ nối thêm một định danh mới vào nhómId của cha mẹ.

    ví dụ. org.apache.maven, org.apache.maven.plugins, org.apache.maven.reporting

  • artifactIdlà tên của bình không có phiên bản. Nếu bạn đã tạo nó thì bạn có thể chọn bất kỳ tên nào bạn muốn bằng chữ thường và không có ký hiệu lạ. Nếu đó là bình của bên thứ ba, bạn phải lấy tên của bình như phân phối.

    ví dụ. maven,commons-math

  • versionnếu bạn phân phối nó thì bạn có thể chọn bất kỳ phiên bản điển hình nào có số và dấu chấm (1.0, 1.1, 1.0.1, ...). Không sử dụng ngày vì chúng thường được liên kết với các bản dựng SNAPSHOT (hàng đêm). Nếu đó là vật phẩm của bên thứ ba, bạn phải sử dụng số phiên bản của chúng bất kể là gì, và lạ như nó có thể nhìn.

    ví dụ. 2.0, 2.0.1,1.3.1


4
Tôi biết các quy ước này, nhưng họ không thực sự nói tên của tạo tác nên được tạo thành như thế nào (không có quy ước đặt tên JAR) và phải làm gì nếu nó giống như nhómId - Tôi chưa thấy một POM nào đó là trường hợp
Noarth

@Noarth 1. Tên hiện vật là theo ý của bạn (nhưng sử dụng dấu gạch nối trong tên là một thông lệ). 2. Bạn đang tìm kiếm một "quy tắc" tuyệt đối không tồn tại (nếu khung công tác tuyệt vời của bạn được tạo từ nhiều mô-đun thì sao?). Xem ví dụ các đồ tạo tác Spring, Maven, Hibernate, v.v.
Pascal Thivent

Không, không tôi không có bất kỳ mô-đun, chỉ là các dự án đơn giản. Trên thực tế, chúng tôi không có một dự án gọi là "khung đường phố tuyệt vời" :)
Noarth

11
Thế còn package ? Có gì khác biệt với groupId?
KonstantinK

1
ArtifactId có được phép có số trong đó không?
theonlygusti

100

Hãy xem xét những điều sau đây để xây dựng ứng dụng Maven đầu tiên cơ bản :

groupId

  • com.companyname.project

artifactId

  • dự án

version

  • 0,0.1

Là một công việc cho thuê tôi nên sử dụng com.my.company.projectnhư là groupIdhay com.client.company.project?
Giacomo Alzetta

@GiacomoAlzetta bạn có thể sử dụng bất kỳ formate nào phù hợp với bạn hơn. Một số ví dụ 'com.companyName.hirePortal' hoặc 'org.compnayName.hirePortal'.
Manwal

3
groupId nên là com.companyname chứ không phải com.companyname.project
Kamil Nekanowicz

1

Tuy nhiên, tôi không đồng ý định nghĩa chính thức về Hướng dẫn đặt tên cho các quy ước trên groupId, artifactId và phiên bản đề xuất groupId phải bắt đầu bằng một tên miền đảo ngược mà bạn kiểm soát.

comcó nghĩa là dự án này thuộc về một công ty, và orgcó nghĩa là dự án này thuộc về một tổ chức xã hội. Đây là ổn, nhưng đối với những tên miền lạ như xxx.tv, xxx.uk, xxx.cn, việc đặt tên nhóm bắt đầu bằng "tv.", "Cn.", NhómId sẽ cung cấp thông tin cơ bản của dự án chứ không phải tên miền.


2
Quy ước này đang ngăn các nhà phát triển sử dụng maven do bạn phải sở hữu một tên miền trước khi triển khai các tạo phẩm của mình vào kho lưu trữ maven trung tâm. Nó là vô lý. Sở hữu một tên miền có thể là một chi phí khá nhiều năm.
Tommy.Tang

1
Không yêu cầu để thực sự sở hữu một đăng ký cho tên miền đó. Yêu cầu duy nhất là Id nhóm của bạn, sẽ là tên gói Java của bạn, không xung đột với bất kỳ tên nào khác khi được triển khai. Quy ước này chắc chắn không ngăn cản các nhà phát triển sử dụng Maven.
Basil Bourque

Một thực hành tốt là lấy tên gói từ URL kho lưu trữ. Nếu bạn đang sử dụng GitHub, tài khoản của bạn được gọi myuservà kho lưu trữ của bạn được gọi myrepo, sau đó chỉ cần sử dụng tên gói com.github.myuser.myrepo. Đó là miễn phí và vẫn là duy nhất.
fxnn

-14

Xem xét điều này để có được một tệp jar hoàn toàn độc đáo:

  • GroupID - com.companyname.project
  • ArtifactId - com-companyname-dự án
  • Gói - com.companyname.project
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.