ฉันจะบอกให้ Maven ใช้การอ้างอิงรุ่นล่าสุดได้อย่างไร


788

ใน Maven มักจะมีการตั้งค่าการพึ่งพาเช่นนี้:

<dependency>
  <groupId>wonderful-inc</groupId>
  <artifactId>dream-library</artifactId>
  <version>1.2.3</version>
</dependency>

ตอนนี้ถ้าคุณกำลังทำงานกับไลบรารีที่มีการเผยแพร่บ่อยครั้งการอัปเดตแท็ก <version> อย่างต่อเนื่องอาจทำให้รำคาญ มีวิธีใดที่จะบอกให้ Maven ใช้เวอร์ชันล่าสุดที่มีอยู่เสมอ (จากที่เก็บ)?


@ มาร์ตินฉันรู้เรื่องการประชุม xyz-SNAPSHOT แต่ฉันกำลังคิดเกี่ยวกับห้องสมุดที่เปิดตัวในเวอร์ชั่นสุดท้ายไปยังที่เก็บ และอื่น ๆ )
Anders Sandvig

176
ฉันไม่แนะนำวิธีปฏิบัตินี้ (หรือใช้ช่วงของเวอร์ชัน) เพื่อประโยชน์ในการสร้างการทำซ้ำ บิลด์ที่เริ่มล้มเหลวอย่างกะทันหันด้วยสาเหตุที่ไม่ทราบสาเหตุน่ารำคาญกว่าการอัพเดตหมายเลขเวอร์ชันด้วยตนเอง
Pascal Thivent

12
@PascalThivent การอัพเดตหมายเลขรีลีสด้วยตนเองใน pom เป็นความเจ็บปวดหากคุณกำลังทำรีลีสต่อเนื่อง ฉันใช้ปลั๊กอินรุ่นรวมกับปลั๊กอิน scm เพื่อให้ได้สิ่งนี้มา (ดูคำตอบของฉัน)
Adam Gent

4
@PascalThivent ทั้งคู่ต่างน่ารำคาญ แต่ก็แตกต่างกัน ฉันต้องการเลือกระหว่างทั้งสองขึ้นอยู่กับสถานการณ์ของฉันและไม่ถูกบังคับให้ใช้เพราะคนอื่นตัดสินใจว่าอันนี้จะดีกว่า
piegames

คำตอบ:


745

บันทึก:

คำตอบนี้ใช้ได้กับ Maven 2 เท่านั้น! ที่กล่าวถึงLATESTและRELEASEmetaversions ได้รับการลดลงใน Maven 3 "เพื่อประโยชน์ในการทำซ้ำได้สร้าง"มากกว่า 6 ปีที่แล้ว โปรดอ้างอิงถึงวิธีการแก้ปัญหาที่สอดคล้องกับ Maven 3นี้


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

เมื่อคุณพึ่งพาปลั๊กอินหรือการขึ้นต่อกันคุณสามารถใช้ค่าเวอร์ชันเป็น LATEST หรือ RELEASE LATEST หมายถึงเวอร์ชันล่าสุดที่เผยแพร่หรือสแน็ปช็อตของส่วนเฉพาะเจาะจงสิ่งประดิษฐ์ที่ปรับใช้ล่าสุดในที่เก็บเฉพาะ RELEASE หมายถึงรีลีสที่ไม่ใช่สแน็ปช็อตสุดท้ายในที่เก็บ โดยทั่วไปไม่ใช่วิธีที่ดีที่สุดในการออกแบบซอฟต์แวร์ซึ่งขึ้นอยู่กับรุ่นที่ไม่เฉพาะเจาะจงของสิ่งประดิษฐ์ หากคุณกำลังพัฒนาซอฟต์แวร์คุณอาจต้องการใช้ RELEASE หรือ LATEST เพื่อความสะดวกสบายเพื่อให้คุณไม่ต้องอัปเดตหมายเลขเวอร์ชันเมื่อมีการเปิดตัวไลบรารี่ของบุคคลที่สามรุ่นใหม่ เมื่อคุณปล่อยซอฟต์แวร์คุณควรตรวจสอบให้แน่ใจว่าโครงการของคุณขึ้นอยู่กับรุ่นเฉพาะเพื่อลดโอกาสในการสร้างหรือโครงการของคุณที่ได้รับผลกระทบจากการเปิดตัวซอฟต์แวร์ที่ไม่ได้อยู่ในการควบคุมของคุณ

ดูส่วนPOM ไวยากรณ์ของหนังสือ Mavenสำหรับรายละเอียดเพิ่มเติม หรือดูเอกสารนี้ในช่วงการอ้างอิงเวอร์ชันที่:

  • วงเล็บเหลี่ยม ( [& ]) หมายถึง "ปิด" (รวม)
  • เครื่องหมายวงเล็บ ( (& )) หมายถึง "เปิด" (พิเศษ)

นี่คือตัวอย่างที่แสดงตัวเลือกต่าง ๆ ในที่เก็บ Maven, com.foo:my-foo มีข้อมูลเมตาต่อไปนี้:

<?xml version="1.0" encoding="UTF-8"?><metadata>
  <groupId>com.foo</groupId>
  <artifactId>my-foo</artifactId>
  <version>2.0.0</version>
  <versioning>
    <release>1.1.1</release>
    <versions>
      <version>1.0</version>
      <version>1.0.1</version>
      <version>1.1</version>
      <version>1.1.1</version>
      <version>2.0.0</version>
    </versions>
    <lastUpdated>20090722140000</lastUpdated>
  </versioning>
</metadata>

หากต้องการการพึ่งพาสิ่งประดิษฐ์นั้นคุณมีตัวเลือกดังต่อไปนี้ ( สามารถระบุช่วงของรุ่นอื่น ๆได้โดยแสดงเฉพาะรายการที่เกี่ยวข้องที่นี่):

ประกาศรุ่นที่แน่นอน (จะแก้ไขให้เป็น 1.0.1 เสมอ):

<version>[1.0.1]</version>

ประกาศรุ่นที่ชัดเจน (มักจะแก้ไขเป็น 1.0.1 เว้นแต่ว่าเกิดการชนกันเมื่อ Maven จะเลือกรุ่นที่ตรงกัน):

<version>1.0.1</version>

ประกาศช่วงเวอร์ชั่นสำหรับ 1.x ทั้งหมด (ปัจจุบันจะแก้ไขเป็น 1.1.1):

<version>[1.0.0,2.0.0)</version>

ประกาศช่วงเวอร์ชันปลายเปิด (จะแก้ไขเป็น 2.0.0):

<version>[1.0.0,)</version>

ประกาศเวอร์ชันเป็น LATEST (จะแก้ไขเป็น 2.0.0) (ลบออกจาก maven 3.x)

<version>LATEST</version>

ประกาศเวอร์ชันเป็น RELEASE (จะแก้ไขเป็น 1.1.1) (ลบออกจาก maven 3.x):

<version>RELEASE</version>

โปรดทราบว่าโดยค่าเริ่มต้นการใช้งานของคุณจะอัปเดต "ล่าสุด" รายการในเมตาดาต้า Maven แต่เพื่ออัปเดต "ปล่อย" รายการคุณต้องเปิดใช้งาน "ปล่อยรายละเอียด" จากซุปเปอร์ POM คุณสามารถทำได้ด้วย "-Prelease-profile" หรือ "-DperformRelease = true"


เป็นมูลค่าที่เน้นว่าวิธีการใด ๆ ที่อนุญาตให้ Maven เลือกรุ่นอ้างอิง (LATEST, RELEASE และรุ่นช่วง) สามารถปล่อยให้คุณเปิดเพื่อสร้างปัญหาเวลาได้เนื่องจากรุ่นที่ใหม่กว่าอาจมีพฤติกรรมที่แตกต่างกัน (ตัวอย่างเช่นปลั๊กอินพึ่งพาได้เปลี่ยนค่าเริ่มต้นก่อนหน้านี้ ค่าจากจริงถึงเท็จพร้อมผลลัพธ์ที่สับสน)

ดังนั้นจึงเป็นความคิดที่ดีที่จะกำหนดเวอร์ชันที่แน่นอนในรีลีส ดังที่คำตอบของ Timชี้ให้เห็นmaven-versions-pluginเป็นเครื่องมือที่มีประโยชน์สำหรับการอัพเดตเวอร์ชันที่พึ่งพาโดยเฉพาะเวอร์ชันที่ใช้: เวอร์ชันล่าสุดและรุ่นล่าสุด: ใช้เป้าหมายล่าสุด - เผยแพร่


76
สวัสดีรวย! มันจะปรากฏขึ้นเมื่อมีการปล่อยและล่าสุดเครื่องหมายรุ่นได้รับการสนับสนุนอีกต่อไปใน Maven 3.x
Pascal Thivent

16
คัดค้านที่ดูเหมือนว่าจะใช้เฉพาะกับปลั๊กอินมากกว่าการพึ่งพาปกติถ้าผมเข้าใจเอกสารอย่างถูกต้อง
Mond เรย์มอนด์

9
@ RichSeller เฮ้รวย; ฉันใช้เวลาสักครู่ในการทำสิ่งนี้ก่อนที่ฉันจะรู้ว่านี่ไม่สามารถใช้งานได้ใน Maven 3.0 อีกต่อไป;) คุณจะพิจารณาแก้ไขคำตอบเพื่อให้เริ่มต้นด้วยการอัปเดตที่ระบุว่า Maven 3.0 เป็นจริงหรือไม่ ขอบคุณมัด!
Miquel

6
ฉันเชื่อว่าความสมดุลที่ดีนั้นคือการล็อครุ่นหลัก แต่รับรุ่นรอง (หรือแพทช์) รุ่นล่าสุด (แล้วแต่จำนวนใดจะใช้สำหรับแก้ไขข้อบกพร่องเฉพาะใน artifcat ที่คุณขึ้นอยู่) ด้วยไวยากรณ์ปัจจุบันนี้ดูเหมือนว่าจะเป็นไปได้เฉพาะกับช่วงเช่น (หมายเหตุ: เริ่มต้นด้วยวงเล็บและลงท้ายด้วย parens):[1.1,2.0)
Amr Mostafa

2
FWIW ... อัปเดตลิงก์ไปยัง Maven3 หมายเหตุความเข้ากันได้: cwiki.apache.org/confluence/display/MAVEN/ …
dyodji

384

ตอนนี้ฉันรู้ว่าหัวข้อนี้เก่า แต่การอ่านคำถามและคำตอบที่ให้มา OP ดูเหมือนว่าปลั๊กอินรุ่น Mavenอาจเป็นคำตอบที่ดีกว่าสำหรับคำถามของเขา:

โดยเฉพาะเป้าหมายต่อไปนี้สามารถใช้ได้:

  • เวอร์ชั่น: use-latest-versionsค้นหา pom สำหรับทุกเวอร์ชั่นที่เป็นเวอร์ชั่นที่ใหม่กว่าและแทนที่ด้วยเวอร์ชั่นล่าสุด
  • เวอร์ชั่น: use-latest- release ค้นหา pom สำหรับเวอร์ชั่นที่ไม่ใช่ SNAPSHOT ทั้งหมดซึ่งเป็นรีลีสที่ใหม่กว่าและแทนที่ด้วยเวอร์ชั่นรีลีสล่าสุด
  • รุ่น: คุณสมบัติการอัพเดทคุณสมบัติการอัพเดทที่กำหนดไว้ในโครงการเพื่อให้สอดคล้องกับการอ้างอิงที่เฉพาะเจาะจงรุ่นล่าสุดที่มีอยู่ สิ่งนี้มีประโยชน์หากชุดการอ้างอิงทั้งหมดต้องถูกล็อคเป็นหนึ่งเวอร์ชัน

นอกจากนี้ยังมีเป้าหมายอื่น ๆ ดังต่อไปนี้:

  • เวอร์ชั่น: display-dependency-updatesสแกนการอ้างอิงของโปรเจ็กต์และสร้างรายงานการพึ่งพาเหล่านั้นซึ่งมีเวอร์ชันที่ใหม่กว่า
  • เวอร์ชั่น: display-plugin-updatesสแกนปลั๊กอินของโปรเจ็กต์และสร้างรายงานของปลั๊กอินเหล่านั้นที่มีเวอร์ชั่นที่ใหม่กว่า
  • เวอร์ชั่น: update-parentอัพเดตส่วนพาเรนต์ของโปรเจ็กต์เพื่อให้อ้างอิงเวอร์ชันล่าสุดที่มีอยู่ ตัวอย่างเช่นหากคุณใช้ POM ขององค์กรเป้าหมายนี้จะมีประโยชน์หากคุณต้องการให้แน่ใจว่าคุณกำลังใช้ POM ขององค์กรเวอร์ชันล่าสุด
  • เวอร์ชั่น: update-child-modulesอัพเดตส่วนพาเรนต์ของโมดูลชายด์ของโปรเจ็กต์ดังนั้นเวอร์ชันจะตรงกับเวอร์ชันของโปรเจ็กต์ปัจจุบัน ตัวอย่างเช่นหากคุณมี pom ของตัวรวบรวมที่เป็นพาเรนต์สำหรับโปรเจ็กต์ที่รวมและเวอร์ชันลูกและพาเรนต์ไม่ซิงค์ mojo นี้สามารถช่วยแก้ไขเวอร์ชันของโมดูลชายด์ (โปรดทราบว่าคุณอาจต้องเรียกใช้ Maven ด้วยตัวเลือก -N เพื่อใช้งานเป้าหมายนี้หากโครงการของคุณเสียอย่างรุนแรงจนไม่สามารถสร้างได้เนื่องจากเวอร์ชันไม่ตรงกัน)
  • รุ่น: lock-snapshotsค้นหา pom สำหรับรุ่น -SNAPSHOT ทั้งหมดและแทนที่ด้วยเวอร์ชันการประทับเวลาปัจจุบันของ -SNAPSHOT นั้นเช่น -20090327.172306-4
  • เวอร์ชั่น: unlock-snapshotsค้นหา pom สำหรับทุกรุ่นของ snapshot ที่ล็อคไว้และแทนที่ด้วย -SNAPSHOT
  • รุ่น: แก้ไขช่วงค้นหาการอ้างอิงโดยใช้ช่วงรุ่นและแก้ไขช่วงเป็นรุ่นเฉพาะที่ใช้
  • เวอร์ชั่น: use- release ค้นหา pom สำหรับเวอร์ชั่น -SNAPSHOT ทั้งหมดที่ได้รับการเผยแพร่และแทนที่ด้วยเวอร์ชั่นรีลีสที่สอดคล้องกัน
  • เวอร์ชั่น: use-next- release ค้นหา pom สำหรับเวอร์ชั่นที่ไม่ใช่ SNAPSHOT ทั้งหมดซึ่งเป็นรีลีสที่ใหม่กว่าและแทนที่ด้วยเวอร์ชันรีลีสถัดไป
  • เวอร์ชั่น: use-next-versionsค้นหา pom สำหรับทุกเวอร์ชั่นที่เป็นเวอร์ชั่นที่ใหม่กว่าและแทนที่ด้วยเวอร์ชั่นถัดไป
  • รุ่น: กระทำลบไฟล์ pom.xml.versionsBackup สร้างครึ่งหนึ่งของ "Poor Man's SCM" ในตัว
  • เวอร์ชั่น:คืนค่าคืนไฟล์ pom.xml จากไฟล์ pom.xml.versionsBackup สร้างครึ่งหนึ่งของ "Poor Man's SCM" ในตัว

แค่คิดว่าฉันจะรวมไว้เพื่อการอ้างอิงในอนาคต


10
ในบริบทนี้อะไรคือความแตกต่างระหว่าง "รุ่น" และ "รุ่น"
Ben Noland

1
@ BenNoland ฉันเชื่อว่าความแตกต่างในกรณีนี้คือรุ่นถัดไปอาจไม่จำเป็นต้องเป็นสิ่งประดิษฐ์ที่วางจำหน่าย เช่นได้รับสิ่งประดิษฐ์รุ่น 1.0.0-SNAPSHOT, 1.0.0 และ 1.0.1-SNAPSHOT และอ้างอิง pom ถึง 1.0.0-SNAPSHOT, เวอร์ชั่น: รุ่นต่อไปและเวอร์ชั่น: รุ่นถัดไปจะแก้ไขเป็น 1.0.0 ในขณะที่รุ่น: รุ่นล่าสุดและรุ่น: รุ่นล่าสุดจะแก้ไขเป็น 1.0.1-SNAPSHOT และ 1.0.0 อย่างเคารพ
Ryan Beesley

1
คุณสามารถแก้ไขความไม่แน่นอนระหว่างรุ่น / รุ่น / สแนปชอตในตารางที่ดีมากนี้ได้ที่นี่: goo.gl/iDq6PK
Ev0oD

1
การพิมพ์เป้าหมายที่เป็นไปได้และไม่เกี่ยวข้องทั้งหมดไม่เป็นประโยชน์
MariuszS

2
ฉันคิดว่าเวอร์ชั่น: use-latest-versions แก้ปัญหาส่วนใหญ่ของ OP
Alex R

172

โปรดดูที่หน้านี้ (ส่วน "ช่วงรุ่นที่อ้างอิง") สิ่งที่คุณอาจต้องการทำคือสิ่งที่ชอบ

<version>[1.2.3,)</version>

ช่วงของเวอร์ชันเหล่านี้มีการใช้งานใน Maven2


ด้วยเหตุผลบางอย่างตัวเลือกนี้ใช้งานไม่ได้สำหรับฉันมันเลือกรุ่นที่อยู่ในช่วง แต่ไม่ใช่รุ่นใหม่ล่าสุด
sorin

4
คุณอาจต้องการดูอย่างใกล้ชิดว่า Maven เปรียบเทียบหมายเลขรุ่นอย่างไร - หากคุณไม่สอดคล้องกับรูปแบบที่เข้มงวด Maven จะเปรียบเทียบเป็นสตริงและไม่ใช่ตัวเลข
Thorbjørn Ravn Andersen

หน้านั้นอยู่ใน Codehaus และอธิบายตัวเองว่าเป็นสิ่ง "ที่ยังไม่ได้นำไปใช้กับ Maven 2.0" ... เอกสาร Maven ไม่ได้พูดอะไรเกี่ยวกับช่วงของรุ่น ฉันพลาดอะไรไปรึเปล่า? ช่วงไหนที่มีการเปิดตัวเวอร์ชั่น พวกเขาอยู่ที่ไหนอธิบายไว้ในเอกสารอย่างเป็นทางการ?
แชนนอน

1
คุณผิดช่วงเวอร์ชั่นหมายความว่าทุกรุ่นโอเคตั้งแต่ 1.2.3 ขึ้นไป นี่ไม่ใช่เวอร์ชันล่าสุดเลย
MariuszS

@sorin คุณอาจมีการพึ่งพาอื่น ๆ ในโครงการของคุณที่ขึ้นอยู่กับสิ่งประดิษฐ์ที่เป็นปัญหาหรือไม่? ลองmvn dependency:tree -Dverboseคิดดูสิ สิ่งนี้สามารถอธิบายรุ่นที่ไม่คาดคิดได้
Eugene Beresovsky

83

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

สิ่งที่ฉันทำคือทำให้ Hudson / Jenkins ทำสิ่งต่อไปนี้สำหรับทุกสิ่งก่อสร้าง:

mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage="update versions" -DperformRelease=true

นั่นคือฉันใช้ปลั๊กอินรุ่นและปลั๊กอิน scm เพื่ออัปเดตการอ้างอิงแล้วตรวจสอบในการควบคุมแหล่งที่มา ใช่ฉันปล่อยให้ CI ของฉันทำเช็ค SCM (ซึ่งคุณต้องทำต่อไปสำหรับปลั๊กอินการปล่อย maven)

คุณจะต้องตั้งค่าปลั๊กอินรุ่นเพื่ออัปเดตเฉพาะสิ่งที่คุณต้องการ:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>versions-maven-plugin</artifactId>
    <version>1.2</version>
    <configuration>
        <includesList>com.snaphop</includesList>
        <generateBackupPoms>false</generateBackupPoms>
        <allowSnapshots>true</allowSnapshots>
    </configuration>
</plugin>

ฉันใช้ปลั๊กอินรุ่นเพื่อทำรุ่นที่ดูแล -SNAPSHOT และตรวจสอบว่ามีรุ่น -SNAPSHOT (ซึ่งเป็นสิ่งสำคัญ)

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

ปรับปรุง

ฉันสังเกตเห็นความคิดเห็นบางส่วนที่ถามถึงขั้นตอนการทำงานนี้โดยเฉพาะ ฉันจะบอกว่าเราไม่ได้ใช้วิธีการนี้อีกต่อไปและเหตุผลใหญ่ว่าทำไมปลั๊กอินรุ่น maven จึงมีข้อผิดพลาดและโดยทั่วไปมีข้อบกพร่อง

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

คุณต้องการเครื่องมือแยกต่างหากจาก maven เพื่อปรับรุ่น (ดังนั้นคุณไม่ต้องพึ่งพาไฟล์ pom เพื่อให้ทำงานได้อย่างถูกต้อง) ฉันได้เขียนเครื่องมือเช่นนี้ในภาษาต่ำต้อยนั่นคือทุบตี สคริปต์จะอัปเดตเวอร์ชันเช่นปลั๊กอินเวอร์ชันและตรวจสอบ pom กลับไปที่การควบคุมแหล่งที่มา มันยังทำงานได้เร็วกว่าปลั๊กอินเวอร์ชัน mvn 100x น่าเสียดายที่มันไม่ได้เขียนในลักษณะการใช้งานสาธารณะ แต่ถ้าผู้คนสนใจฉันสามารถทำได้และวางไว้ในกระทู้หรือ github

กลับไปที่เวิร์กโฟลว์ตามความคิดเห็นที่ถามเกี่ยวกับนี่คือสิ่งที่เราทำ:

  1. เรามีโครงการประมาณ 20 โครงการในที่ทำงานของพวกเขาเองด้วยงานของเจนกินส์
  2. เมื่อเราปล่อยปลั๊กอินใช้ maven release เวิร์กโฟลว์ของที่อยู่ในเอกสารประกอบของปลั๊กอิน ปลั๊กอินการจัดเรียง maven ของ sucks (และฉันใจดี) แต่มันใช้งานได้ วันหนึ่งเราวางแผนที่จะเปลี่ยนวิธีนี้ด้วยสิ่งที่เหมาะสมกว่า
  3. เมื่อหนึ่งในโครงการที่ได้รับการปล่อยตัวเจนกินส์แล้วทำงานพิเศษเราจะเรียกการอัพเดตงานทุกเวอร์ชั่น (วิธีที่เจนกินส์รู้ว่าการเปิดตัวของมันนั้นมีความซับซ้อนในส่วนหนึ่งเนื่องจากปลั๊กอินการปล่อยเจนเมนกิ้นส์
  4. การอัปเดตงานทุกเวอร์ชั่นรู้เกี่ยวกับโครงการทั้งหมด 20 โครงการ จริงๆแล้วมันเป็นตัวรวบรวม pom ที่จะเจาะจงกับโครงการทั้งหมดในส่วนโมดูลตามลำดับการพึ่งพา เจนกินส์ใช้เวทย์มนตร์ groovy / bash foo ของเราที่จะดึงโปรเจ็กต์ทั้งหมดให้อัปเดตเวอร์ชันล่าสุดแล้วตรวจสอบปอม
  5. สำหรับแต่ละโปรเจ็กต์หาก pom มีการเปลี่ยนแปลง (เนื่องจากมีการเปลี่ยนแปลงเวอร์ชั่นในการพึ่งพาบางอย่าง) มันถูกเช็คอินและจากนั้นเราจะ ping เจนกินส์ทันทีเพื่อเรียกใช้งานที่สอดคล้องกันสำหรับโครงการนั้น (นี่คือเพื่อรักษาลำดับการพึ่งพา ของเครื่องมือกำหนดตารางการสำรวจ SCM)

ณ จุดนี้ฉันคิดว่ามันเป็นสิ่งที่ดีที่จะมีรุ่นแยกต่างหากและรุ่นอัตโนมัติเป็นเครื่องมือแยกต่างหากจากรุ่นทั่วไปของคุณ

ตอนนี้คุณอาจคิดว่าการจัดเรียง maven ของปัญหาเนื่องจากปัญหาที่กล่าวข้างต้น แต่จริง ๆ แล้วมันจะค่อนข้างยากกับเครื่องมือสร้างที่ไม่มีประกาศง่ายต่อการแยกวิเคราะห์ไวยากรณ์ที่ขยายได้ (aka XML)

ในความเป็นจริงเราเพิ่มแอตทริบิวต์ XML ที่กำหนดเองผ่านทางเนมสเปซเพื่อช่วยแนะนำสคริปต์ bash / groovy (เช่นอย่าอัปเดตเวอร์ชันนี้)


5
ขอบคุณสำหรับการรวมแรงจูงใจ (การปรับใช้อย่างต่อเนื่อง) ในคำตอบของคุณ
David J. Liszewski

10
ฉันคิดว่าจุดสำคัญที่นี่คือการสร้างจะทำซ้ำได้ด้วยวิธีนี้ในขณะที่เมื่อใช้ช่วงรุ่นหรือ - ล่าสุดพวกเขาไม่ได้!
marc.guenther

ฉันต้องการที่สองวิธีแก้ปัญหาโดยใช้เครื่องมือภายนอกการเปลี่ยนแปลง pom โครงการก่อนที่จะเรียกใช้การสร้าง นอกจากนี้เรายังใช้วิธีการนี้เนื่องจากปลั๊กอิน version-range-bugged นั้นมีมานานแล้วเช่นการไปยังวันที่บัญชีและไม่ใช่เฉพาะเวอร์ชั่น
Daniel Hajduk

37

ไวยากรณ์ของการพึ่งพาอาศัยอยู่ที่เอกสารข้อมูลจำเพาะเกี่ยวกับข้อกำหนดความต้องการเวอร์ชันการอ้างอิง นี่คือเพื่อความสมบูรณ์:

versionองค์ประกอบการพึ่งพา ' กำหนดข้อกำหนดของรุ่นที่ใช้ในการคำนวณรุ่นการพึ่งพาที่มีประสิทธิภาพ ข้อกำหนดเวอร์ชันมีไวยากรณ์ต่อไปนี้:

  • 1.0: ความต้องการ "เบา" ใน 1.0 (เพียงคำแนะนำถ้ามันตรงกับช่วงอื่น ๆ ทั้งหมดสำหรับการพึ่งพา)
  • [1.0]: ข้อกำหนด "ยาก" ใน 1.0
  • (,1.0]: x <= 1.0
  • [1.2,1.3]: 1.2 <= x <= 1.3
  • [1.0,2.0): 1.0 <= x <2.0
  • [1.5,): x> = 1.5
  • (,1.0],[1.2,): x <= 1.0 หรือ x> = 1.2; หลายชุดถูกคั่นด้วยเครื่องหมายจุลภาค
  • (,1.1),(1.1,): สิ่งนี้ไม่รวม 1.1 (ตัวอย่างเช่นหากไม่ทราบว่าใช้งานร่วมกับห้องสมุดนี้ได้)

ในกรณีของคุณคุณสามารถทำสิ่งที่ชอบ <version>[1.2.3,)</version>


15

คุณอาจขึ้นอยู่กับรุ่นพัฒนาที่เห็นได้ชัดว่ามีการเปลี่ยนแปลงอย่างมากระหว่างการพัฒนาหรือไม่?

แทนที่จะเพิ่มรุ่นพัฒนารุ่นคุณสามารถใช้รุ่น snapshot ที่คุณเขียนทับเมื่อจำเป็นซึ่งหมายความว่าคุณไม่จำเป็นต้องเปลี่ยนแท็กเวอร์ชันในทุกการเปลี่ยนแปลงเล็กน้อย บางอย่างเช่น 1.0-SNAPSHOT ...

แต่บางทีคุณกำลังพยายามที่จะบรรลุสิ่งอื่น;)


7

ใครที่เคยใช้ล่าสุดโปรดตรวจสอบให้แน่ใจว่าคุณมี -U ไม่เช่นนั้นภาพล่าสุดจะไม่ถูกดึงออกมา

mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories

แม้แต่การใช้ -UI กำลังได้รับCouldn't download artifact: Failed to resolve version for com.app:common:jar:LATEST
Robert

7

เมื่อถึงเวลาที่คำถามนี้ถูกโพสต์มีข้อผิดพลาดบางอย่างกับช่วงรุ่นใน Maven แต่สิ่งเหล่านี้ได้รับการแก้ไขใน Maven รุ่นที่ใหม่กว่า บทความนี้รวบรวมได้ดีมากว่ารุ่นทำงานอย่างไรและแนวปฏิบัติที่ดีที่สุดเพื่อทำความเข้าใจว่า Maven เข้าใจเวอร์ชันอย่างไร: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855


2
ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
Karl Richter

6

ความจริงคือแม้กระทั่งใน 3.x มันยังคงใช้งานได้น่าประหลาดใจที่โครงการสร้างและปรับใช้ แต่คำสำคัญล่าสุด / ปล่อยทำให้เกิดปัญหาใน m2e และคราสทั่วสถานที่นอกจากนี้โครงการยังขึ้นอยู่กับการพึ่งพาซึ่งปรับใช้ผ่าน LATEST / RELEASE ล้มเหลวในการรับรู้รุ่น

มันจะทำให้เกิดปัญหาหากคุณพยายามกำหนดเวอร์ชันเป็นคุณสมบัติและอ้างอิงกับที่อื่น

ดังนั้นข้อสรุปคือใช้รุ่น -maven-pluginถ้าคุณทำได้


5

บางครั้งคุณไม่ต้องการใช้ช่วงของเวอร์ชันเนื่องจากดูเหมือนว่า "ช้า" เพื่อแก้ไขการพึ่งพาของคุณโดยเฉพาะเมื่อมีการส่งมอบอย่างต่อเนื่องและมีรุ่นจำนวนมาก - ส่วนใหญ่ในระหว่างการพัฒนาอย่างมาก

หนึ่งวิธีแก้ปัญหาจะใช้รุ่น-Maven ปลั๊กอิน ตัวอย่างเช่นคุณสามารถประกาศคุณสมบัติ:

<properties>
    <myname.version>1.1.1</myname.version>
</properties>

และเพิ่มรุ่น -maven-plugin ไปยังไฟล์ pom ของคุณ:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <properties>
                    <property>
                        <name>myname.version</name>
                        <dependencies>
                            <dependency>
                                <groupId>group-id</groupId>
                                <artifactId>artifact-id</artifactId>
                                <version>latest</version>
                            </dependency>
                        </dependencies>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
</build>

จากนั้นในการอัพเดทการพึ่งพาคุณต้องดำเนินการตามเป้าหมาย:

mvn versions:update-properties validate

หากมีรุ่นใหม่กว่า 1.1.1 มันจะบอกคุณ:

[INFO] Updated ${myname.version} from 1.1.1 to 1.3.2

3

หากคุณต้องการ Maven ควรใช้การพึ่งพาเวอร์ชันล่าสุดจากนั้นคุณสามารถใช้ปลั๊กอิน Maven รุ่นและวิธีการใช้ปลั๊กอินนี้ทิมได้รับคำตอบที่ดีแล้วทำตามคำตอบของเขาคำตอบ

แต่ในฐานะนักพัฒนาฉันจะไม่แนะนำวิธีปฏิบัติประเภทนี้ ทำไม?

คำตอบสำหรับเหตุผลที่Pascal Thiventได้ให้ไว้แล้วในความคิดเห็นของคำถาม

ฉันไม่แนะนำวิธีปฏิบัตินี้ (หรือใช้ช่วงของเวอร์ชัน) เพื่อประโยชน์ในการสร้างการทำซ้ำ บิลด์ที่เริ่มล้มเหลวอย่างกะทันหันด้วยสาเหตุที่ไม่ทราบสาเหตุน่ารำคาญกว่าการอัพเดตหมายเลขเวอร์ชันด้วยตนเอง

ฉันจะแนะนำการฝึกฝนประเภทนี้:

<properties>
    <spring.version>3.1.2.RELEASE</spring.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

</dependencies>

ง่ายต่อการบำรุงรักษาและง่ายต่อการตรวจแก้จุดบกพร่อง คุณสามารถอัปเดต POM ได้ในเวลาไม่นาน


ถ้าคุณใช้รุ่น -maven-plugin บิลด์จะยังคงทำซ้ำได้ การอัปเดตเวอร์ชัน Maven สามารถทำได้ในการมอบหมายแยกต่างหาก (อย่างที่คุณเห็นจากคำตอบของฉันคุณต้องระบุเป้าหมายแยกต่างหากมันไม่ได้เกิดขึ้นอย่างน่าอัศจรรย์ในการสร้าง)
Markon

1

โซลูชันของฉันใน maven 3.5.4 ใช้ nexus ใน eclipse:

<dependency>
    <groupId>yilin.sheng</groupId>
    <artifactId>webspherecore</artifactId>
    <version>LATEST</version> 
</dependency>

จากนั้นในคราส: atl + F5และเลือกforce update of snapshots/release

มันใช้งานได้สำหรับฉัน


จะไม่ทำงานที่บรรทัดคำสั่ง แต่ด้วยเหตุผลที่กล่าวไว้ข้างต้นในโพสต์ต่างๆ พวกเราหลายคนต้องปฏิบัติตามการสร้างอัตโนมัติดังนั้น POM ของเราต้องทำงานเมื่อทำงานที่บรรทัดคำสั่งไม่ใช่เฉพาะใน Eclipse
bigbadmouse

ฉันใช้ maven 3.5.4 และได้สิ่งนี้เมื่อใช้ 'ล่าสุด': เป็น LATEST หรือ RELEASE (ทั้งคู่ถูกคัดค้าน) @ บรรทัด 154, คอลัมน์ 13
Leonardo Leonardo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.