Artefak dan penamaan groupId Maven

291

Saat ini saya sedang dalam proses memindahkan beberapa proyek dari Ant ke Maven. Sesuai dengan saya, saya ingin menggunakan konvensi yang mapan untuk menemukan groupIddan artifactId, tetapi saya tidak dapat menemukan konvensi terperinci (ada beberapa, tetapi mereka tidak membahas poin yang saya ingin tahu).

Ambil contoh proyek ini, pertama paket Java: com.mycompany.teatimer

Pengatur waktu teh sebenarnya adalah dua kata, tetapi konvensi penamaan paket Java melarang penyisipan garis bawah atau tanda hubung, jadi saya menulis semuanya bersama-sama.

Saya memilih yang groupIdidentik dengan ID paket karena saya pikir itu ide yang bagus. Apakah itu?

Akhirnya, saya harus memilih artifactId, yang saat ini saya pilih teatimer. Tapi ketika saya melihat proyek-proyek lain Maven, mereka menggunakan tanda hubung untuk membagi kata-kata dalam artifactIds, seperti ini: tea-timer. Tapi itu memang terlihat aneh ketika digabungkan ke groupId: com.mycompany.teatimer.tea-timer.

Bagaimana Anda melakukan ini?

Contoh lain:

Nama paket: com.mycompany.awesomeinhouseframework

groupId: com.mycompany.awesomeinhouseframework(?)

artifactId: awesome-inhouse-framework(?)

Noarth
sumber
1
Di mana Anda melihat groupId digabungkan dengan artifactId? Saya pikir konvensi yang Anda nyatakan adalah yang benar.
Abhinav Sarkar
2
Sebenarnya, garis bawah dibolehkan dalam nama paket java, lihat: docs.oracle.com/javase/tutorial/java/package/namingpkgs.html
Adriaan Koster

Jawaban:

146

Konvensi Anda tampaknya masuk akal. Jika saya mencari kerangka kerja Anda di repo Maven, saya akan mencari awesome-inhouse-framework-x.y.jardi com.mycompany.awesomeinhouseframeworkdirektori grup. Dan saya akan menemukannya di sana sesuai dengan konvensi Anda.

Dua aturan sederhana bekerja untuk saya:

  • paket reverse-domain-untuk groupId (karena itu cukup unik) dengan semua kendala mengenai nama paket Java
  • nama proyek sebagai artifactId (perlu diingat bahwa itu harus nama jar-ramah yaitu tidak mengandung karakter yang mungkin tidak valid untuk nama file atau hanya terlihat aneh)
Henryk Konsek
sumber
Oke, jika Anda dan orang lain berpikir itu normal, maka saya akan melakukannya begitu saja, terima kasih!
Noarth
Saya menemukan campuran ejaan non-hyphen (awesomeinhouseframework) dan hyphen (awesome-inhouse-framework) agak aneh. Karena groupid tidak mengizinkan tanda hubung saya akan tetap menggunakan ejaan non-hubung untuk artifactid juga.
Michael Küller
3
Tolong jelaskan apa yang Anda maksud dengan "nama-ramah botol"?
vikramvi
1
Dijelaskan dalam jawabannya :).
Henryk Konsek
241

Keanehan itu sangat subyektif, saya hanya menyarankan untuk mengikuti rekomendasi resmi:

Panduan untuk penamaan konvensi pada groupId, artifactId, dan versi

  • groupIdakan mengidentifikasi proyek Anda secara unik di semua proyek, jadi kami perlu memberlakukan skema penamaan. Itu harus mengikuti aturan nama paket, apa artinya harus setidaknya sebagai nama domain yang Anda kontrol, dan Anda dapat membuat subkelompok sebanyak yang Anda inginkan. Lihat Informasi lebih lanjut tentang nama paket .

    misalnya. org.apache.maven,org.apache.commons

    Cara yang baik untuk menentukan granularity dari groupId adalah dengan menggunakan struktur proyek. Yaitu, jika proyek saat ini adalah proyek beberapa modul, itu harus menambahkan pengidentifikasi baru ke groupId induk.

    misalnya. org.apache.maven, org.apache.maven.plugins, org.apache.maven.reporting

  • artifactIdadalah nama toples tanpa versi. Jika Anda membuatnya maka Anda dapat memilih nama apa pun yang Anda inginkan dengan huruf kecil dan tanpa simbol aneh. Jika itu adalah toples pihak ketiga, Anda harus mengambil nama toples tersebut saat didistribusikan.

    misalnya. maven,commons-math

  • versionjika Anda mendistribusikannya maka Anda dapat memilih versi tipikal dengan angka dan titik (1.0, 1.1, 1.0.1, ...). Jangan gunakan tanggal karena mereka biasanya dikaitkan dengan SNAPSHOT (malam) membangun. Jika itu adalah artefak pihak ketiga, Anda harus menggunakan nomor versi mereka apa pun itu, dan seaneh yang terlihat.

    misalnya. 2.0, 2.0.1,1.3.1

Thivent Pascal
sumber
4
Saya tahu konvensi ini, tetapi mereka tidak benar-benar mengatakan bagaimana nama artefak harus dibuat (tidak ada konvensi penamaan JAR) dan apa yang harus dilakukan jika itu akan sama dengan groupId - Saya belum melihat satu POM dimana itu masalahnya.
Noarth
@Noarth 1. Nama artefak sesuai dengan kebijaksanaan Anda (tetapi menggunakan tanda hubung dalam nama adalah praktik yang umum). 2. Anda sedang mencari "aturan" absolut yang tidak ada (bagaimana jika kerangka kerja in-house Anda yang luar biasa terbuat dari beberapa modul?). Lihat misalnya artefak Spring, Maven, Hibernate, dll.
Pascal Thivent
Tidak, tidak, saya tidak punya modul, hanya proyek sederhana. Faktanya, kami tidak memiliki proyek yang disebut "kerangka kerja inhouse yang luar biasa" :)
Noarth
11
Bagaimana dengan package? Apa perbedaannya dengan groupId?
KonstantinK
1
Apakah artifactId diizinkan memiliki nomor di dalamnya?
theonlygusti
100

Pertimbangkan yang berikut untuk membangun aplikasi Maven dasar pertama :

groupId

  • com.companyname.project

artifactId

  • proyek

version

  • 0.0.1
Manwal
sumber
Sebagai pekerjaan untuk disewa, apakah saya harus menggunakan com.my.company.projectsebagai groupIdatau com.client.company.project?
Giacomo Alzetta
@ GiacomoAlzetta Anda dapat menggunakan salah satu dari format sesuai dengan Anda lebih baik. Beberapa contoh 'com.companyName.hirePortal' atau 'org.compnayName.hirePortal'.
Manwal
3
groupId harus com.companyname bukan com.companyname.project
Kamil Nekanowicz
1

Namun, saya tidak setuju dengan definisi resmi dari Panduan untuk memberi nama konvensi pada groupId, artifactId, dan versi yang mengusulkan groupId harus dimulai dengan nama domain terbalik yang Anda kontrol.

comberarti proyek ini milik perusahaan, dan orgberarti proyek ini milik organisasi sosial. Ini baik-baik saja, tetapi untuk domain aneh seperti xxx.tv, xxx.uk, xxx.cn, tidak masuk akal untuk memberi nama groupId dimulai dengan "tv.", "Cn.", GroupId harus memberikan informasi dasar dari proyek daripada domain.

Tommy.Tang
sumber
2
Konvensi ini mencegah pengembang menggunakan maven karena Anda harus memiliki domain sebelum menggunakan artefak Anda ke repositori maven pusat. Itu konyol. Memiliki domain bisa menjadi biaya yang cukup dari tahun ke tahun.
Tommy.Tang
1
Tidak ada persyaratan untuk benar-benar memiliki pendaftaran untuk nama domain itu. Satu-satunya persyaratan adalah bahwa id grup Anda, yang akan menjadi nama paket Java Anda, tidak bertentangan dengan nama lain seperti itu ketika digunakan. Konvensi ini tentu saja tidak menghalangi pengembang untuk menggunakan Maven.
Basil Bourque
Praktik yang baik adalah mendapatkan nama paket dari URL repositori. Jika Anda menggunakan GitHub, akun Anda dipanggil myuserdan repositori Anda dipanggil myrepo, maka cukup gunakan nama paket com.github.myuser.myrepo. Itu gratis dan masih unik.
fxnn
-14

Pertimbangkan ini untuk mendapatkan file jar yang sepenuhnya unik:

  • GroupID - com.companyname.project
  • ArtifactId - com-companyname-project
  • Paket - com.companyname.project
pembuat kode
sumber