สิ่งประดิษฐ์ Maven และการตั้งชื่อกลุ่ม


291

ขณะนี้ฉันกำลังอยู่ระหว่างการย้ายโครงการจาก Ant ไปยัง Maven Conformist อย่างที่ฉันเป็นฉันต้องการใช้ข้อตกลงที่ได้รับการยอมรับอย่างดีในการค้นหาgroupIdและartifactIdแต่ฉันไม่สามารถหาข้อตกลงที่มีรายละเอียด (มีบ้าง แต่พวกเขาไม่ครอบคลุมประเด็นที่ฉันสงสัย)

ทำโปรเจ็กต์นี้เป็นตัวอย่างแรกแพ็คเกจ Java: com.mycompany.teatimer

ที่จริงแล้วTea Timerเป็นสองคำ แต่จาวาแพคเกจการตั้งชื่อการประชุมห้ามการแทรกขีดล่างหรือเครื่องหมายขีดคั่นดังนั้นฉันจึงเขียนมันทั้งหมดเข้าด้วยกัน

ฉันเลือกgroupIdรหัสแพคเกจที่เหมือนกันเพราะฉันคิดว่าเป็นความคิดที่ดี ใช่ไหม?

สุดท้ายผมต้องเลือกผมในขณะนี้ไปartifactId teatimerแต่เมื่อฉันมองไปที่โครงการ Maven อื่น ๆ ที่พวกเขาใช้ยัติภังค์คำแยกในartifactIds tea-timerเช่นนี้ แต่มันจะดูแปลกเมื่อตัดแบ่งไปที่:groupIdcom.mycompany.teatimer.tea-timer

คุณจะทำอย่างไร

ตัวอย่างอื่น:

ชื่อแพ็คเกจ: com.mycompany.awesomeinhouseframework

groupId: com.mycompany.awesomeinhouseframework(?)

artifactId: awesome-inhouse-framework(?)


1
คุณเห็น groupId ที่เชื่อมโยงกับ artifactId ที่ไหน ฉันคิดว่าอนุสัญญาที่คุณระบุไว้นั้นถูกต้อง
Abhinav Sarkar

2
ที่จริงแล้วขีดเส้นใต้ได้รับอนุญาตในชื่อแพคเกจจาวาดู: docs.oracle.com/javase/tutorial/java/package/namingpkgs.html
Adriaan Koster

คำตอบ:


146

การประชุมของคุณดูเหมือนจะสมเหตุสมผล ถ้าฉันค้นหาเฟรมเวิร์กของคุณใน repo Maven ฉันจะค้นหาawesome-inhouse-framework-x.y.jarในcom.mycompany.awesomeinhouseframeworkไดเรกทอรีกลุ่ม และฉันจะพบมันที่นั่นตามการประชุมของคุณ

กฎง่ายๆสองข้อเหมาะกับฉัน:

  • reverse-domain-packages สำหรับ groupId (เนื่องจากมีความเป็นเอกลักษณ์) โดยมีข้อ จำกัดทั้งหมดเกี่ยวกับชื่อแพ็คเกจ Java
  • ชื่อโปรเจ็กต์เป็น artifactId (โปรดจำไว้ว่าควรเป็นมิตรกับชื่อ jar คือไม่มีอักขระที่อาจไม่ถูกต้องสำหรับชื่อไฟล์หรือดูแปลก ๆ )

โอเคถ้าคุณกับ abhin4v คิดว่าเป็นเรื่องปกติฉันจะทำแบบนั้นขอบคุณ!
Noarth

ฉันพบว่าส่วนผสมที่ไม่ใช่ยัติภังค์ (Awesomeinhouseframework) และยัติภังค์ (Awesome-inhouse-framework) สะกดผิดไปเล็กน้อย เนื่องจาก groupid ไม่อนุญาตให้ใช้เครื่องหมายยัติภังค์ฉันจะติดกับการสะกดคำที่ไม่ใช่ยัติภังค์สำหรับสิ่งประดิษฐ์เช่นกัน
Michael Küller

3
โปรดอธิบายความหมายของคำว่า "jar-name friendly" แบบง่าย ๆ ?
vikramvi

1
ชี้แจงในคำตอบ :)
Henryk Konsek

241

ความแปลกประหลาดเป็นเรื่องส่วนตัวฉันขอแนะนำให้ทำตามคำแนะนำอย่างเป็นทางการ:

คำแนะนำเกี่ยวกับการตั้งชื่อข้อตกลงใน groupId, artifactId และรุ่น

  • groupIdจะระบุโครงการของคุณโดยเฉพาะในทุกโครงการดังนั้นเราจึงจำเป็นต้องบังคับใช้แบบแผนการตั้งชื่อ ต้องปฏิบัติตามกฎชื่อแพ็คเกจหมายความว่าอย่างน้อยต้องเป็นชื่อโดเมนที่คุณควบคุมและคุณสามารถสร้างกลุ่มย่อยได้มากเท่าที่คุณต้องการ ดูข้อมูลเพิ่มเติมเกี่ยวกับชื่อแพคเกจ

    เช่น. org.apache.maven,org.apache.commons

    วิธีที่ดีในการกำหนดความละเอียดของ groupId คือการใช้โครงสร้างโครงการ นั่นคือถ้าโครงการปัจจุบันเป็นโครงการโมดูลหลายโครงการควรผนวกตัวระบุใหม่เข้ากับ groupId ของผู้ปกครอง

    เช่น. org.apache.maven, org.apache.maven.plugins, org.apache.maven.reporting

  • artifactIdเป็นชื่อของ jar ที่ไม่มีเวอร์ชัน หากคุณสร้างมันขึ้นมาคุณสามารถเลือกชื่ออะไรก็ได้ที่คุณต้องการด้วยตัวพิมพ์เล็กและไม่มีสัญลักษณ์แปลก ๆ หากเป็นขวดของบุคคลที่สามคุณจะต้องใช้ชื่อขวดตามที่แจกจ่าย

    เช่น. maven,commons-math

  • versionหากคุณแจกจ่ายให้คุณสามารถเลือกเวอร์ชันทั่วไปที่มีตัวเลขและจุด (1.0, 1.1, 1.0.1, ... ) อย่าใช้วันที่เนื่องจากมักเกี่ยวข้องกับงานสร้าง SNAPSHOT (ทุกคืน) ถ้ามันเป็นสิ่งประดิษฐ์ของบุคคลที่สามคุณต้องใช้หมายเลขเวอร์ชันของมันไม่ว่าจะเป็นอะไรและแปลกอย่างที่ดู

    เช่น. 2.0, 2.0.1,1.3.1


4
ฉันรู้อนุสัญญาเหล่านี้ แต่พวกเขาไม่ได้พูดจริง ๆ ว่าควรสร้างชื่อสิ่งประดิษฐ์อย่างไร (ไม่มีแบบแผนการตั้งชื่อ JAR) และจะทำอย่างไรถ้ามันจะเหมือนกับ groupId - ฉันไม่ได้เห็น POM เดียว ในกรณีที่เป็น
Noarth

@Noarth 1. ชื่อของสิ่งประดิษฐ์นั้นขึ้นอยู่กับดุลยพินิจของคุณ (แต่การใช้ยัติภังค์ในชื่อนั้นเป็นวิธีปฏิบัติทั่วไป) 2. คุณกำลังมองหา "กฎ" แบบสัมบูรณ์ที่ไม่มีอยู่ (จะทำอย่างไรถ้ากรอบภายในของคุณยอดเยี่ยมทำมาจากหลายโมดูล) ดูตัวอย่างของ Spring, Maven, Hibernate และอื่น ๆ
Pascal Thivent

ไม่ไม่ฉันไม่มีโมดูลใด ๆ แค่โครงการง่ายๆ อันที่จริงแล้วเราไม่มีโครงการที่เรียกว่า "กรอบการทำงานภายในที่ยอดเยี่ยม" :)
Noarth

11
เกี่ยวกับpackageอะไร groupId ต่างกันอย่างไร
KonstantinK

1
สิ่งประดิษฐ์ที่ฉันอนุญาตให้มีตัวเลขในมันได้หรือไม่
theonlygusti

100

พิจารณาการสร้างแอปพลิเคชั่นMavenพื้นฐานก่อน:

groupId

  • com.companyname.project

artifactId

  • โครงการ

version

  • 0.0.1

เป็นงานให้เช่าฉันควรใช้com.my.company.projectเป็นgroupIdหรือcom.client.company.project?
Giacomo Alzetta

@GiacomoAlzetta คุณสามารถใช้รูปแบบที่เหมาะกับคุณได้ดีกว่า ตัวอย่างบางส่วน 'com.companyName.hirePortal' หรือ 'org.compnayName.hirePortal'
Manwal

3
groupId ควรเป็น com.companyname ไม่ใช่ com.companyname.project
Kamil Nekanowicz

1

อย่างไรก็ตามฉันไม่เห็นด้วยคำจำกัดความอย่างเป็นทางการของGuide ในการตั้งชื่อข้อตกลงใน groupId, artifactId และเวอร์ชันที่เสนอ groupId ต้องเริ่มต้นด้วยชื่อโดเมนที่คุณควบคุม

comหมายถึงโครงการนี้เป็นของ บริษัท และorgหมายถึงโครงการนี้เป็นขององค์กรทางสังคม สิ่งเหล่านี้ใช้ได้ แต่สำหรับโดเมนแปลก ๆ เช่น xxx.tv, xxx.uk, xxx.cn มันไม่สมเหตุสมผลที่จะตั้งชื่อ groupId ที่เริ่มต้นด้วย "tv.", "cn.", groupId ควรส่งข้อมูลพื้นฐาน ของโครงการมากกว่าโดเมน


2
การประชุมนี้ป้องกันนักพัฒนาที่ใช้ Maven เนื่องจากคุณต้องมีโดเมนก่อนที่จะปรับใช้สิ่งประดิษฐ์ของคุณกับที่เก็บ Maven กลาง มันไร้สาระ การมีโดเมนอาจมีค่าใช้จ่ายค่อนข้างปีต่อปี
Tommy.Tang

1
นอกจากนี้ไม่มีความต้องการที่จะเป็นเจ้าของจริงลงทะเบียนชื่อโดเมนที่ ข้อกำหนดเพียงอย่างเดียวคือรหัสกลุ่มของคุณซึ่งจะเป็นชื่อแพคเกจ Java ของคุณไม่ขัดแย้งกับชื่ออื่นใดเมื่อปรับใช้ การประชุมนี้ไม่แน่นอนป้องกันผู้พัฒนาจากการใช้ Maven
Basil Bourque

แนวปฏิบัติที่ดีคือการหาชื่อแพ็กเกจจาก URL ที่เก็บ หากคุณกำลังใช้ GitHub บัญชีของคุณเรียกว่าmyuserและพื้นที่เก็บข้อมูลของคุณเรียกว่าแล้วก็ใช้ชื่อแพคเกจmyrepo com.github.myuser.myrepoนั่นฟรีและไม่เหมือนใคร
fxnn

-14

พิจารณาสิ่งนี้เพื่อรับไฟล์ jar ที่ไม่ซ้ำกันทั้งหมด:

  • GroupID - com.companyname.project
  • ArtifactId - com-companyname-project
  • แพ็คเกจ - com.companyname.project
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.