โมดูล Maven + การสร้างโมดูลเฉพาะ


383

ฉันมีหลายโมดูลโครงการ Maven กับโครงการผู้ปกครองPและสามโมดูลย่อยA, และB Cทั้งสองBและเป็นโครงการสงครามและทั้งสองจะขึ้นอยู่กับ CA

ฉันสามารถพิมพ์mvn compileในPและมีทั้งหมดของโมดูลย่อยรวบรวมอย่างถูกต้อง ปัญหามาเมื่อฉันต้องการดำเนินการสำหรับโมดูลเฉพาะ

ฉันต้องการที่จะสามารถจัดแพคเกจสงครามสำหรับโครงการBแต่เมื่อฉันเรียกใช้คำสั่งแพคเกจจากBไดเรกทอรี 's Aก็บ่นว่าไม่สามารถหาอ้างอิงสำหรับ

ฉันเข้าใจจากคำถามนี้: Maven และโมดูลที่ขึ้นต่อกันซึ่งบางที Maven ไม่ได้ออกแบบมาสำหรับการแก้ปัญหาการพึ่งพาประเภทนี้ แต่ที่ถามว่าฉันจะจัดแพคเกจได้Bอย่างไร

  1. ฉันต้องเรียกใช้mvn packageลำดับชั้นโครงการทั้งหมดเมื่อฉันต้องการจริงๆBหรือไม่?

  2. ฉันต้องติดตั้งสแนปชอตของ A ลงในที่เก็บข้อมูลโลคัลของฉันทุกครั้งที่ต้องการแพ็กเกจBหรือไม่

สถานการณ์ที่สองนี้ไม่สนุกมากเมื่อAยังอยู่ในระหว่างการพัฒนา

แนวทางปฏิบัติที่ดีที่สุดที่นี่?


คำตอบ:


694

แนวทางปฏิบัติที่ดีที่สุดที่นี่?

ใช้ตัวเลือกเครื่องปฏิกรณ์ขั้นสูง Maven โดยเฉพาะอย่างยิ่ง:

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

ดังนั้นเพียงแค่cdเข้าไปในไดเรกทอรี P หลักและเรียกใช้:

mvn install -pl B -am

และสิ่งนี้จะสร้าง B และโมดูลที่ต้องการโดย B

โปรดทราบว่าคุณต้องใช้โคลอนหากคุณกำลังอ้างถึงสิ่งartifactIdที่แตกต่างจากชื่อไดเรกทอรี:

mvn install -pl :B -am

ตามที่อธิบายไว้ที่นี่: https://stackoverflow.com/a/26439938/480894


15
สำหรับทุกคนที่เข้ามาที่หน้านี้ในปี 2011 นี่เป็นคำตอบที่ดีกว่า ตอนนี้มีการรองรับโมดูลหลายอย่างที่ดีกว่าภายใน Maven เอง (Maven 2.1 ขึ้นไป) คุณไม่จำเป็นต้องใช้ปลั๊กอินเครื่องปฏิกรณ์
Spedge

17
อีกตัวเลือกที่มีประโยชน์มากคือ "-amd, --also-make-dependents" ซึ่งสร้างโมดูลทั้งหมดขึ้นอยู่กับโครงการในรายการเครื่องปฏิกรณ์
ขัดขวาง

1
สิ่งที่เกี่ยวกับการสร้างโมดูลหลาน?
Bax

12
@Bax ใช้mvn install -pl .,parent/child,parent/child/grandchild Use จุลภาคเพื่อแยกหลายโครงการและ สำหรับผู้ปกครอง pom
Neo

1
เมื่อฉันพยายามclean packageโมดูลด้วยวิธีนี้มันไม่สามารถแก้ไขการพึ่งพาเครื่องปฏิกรณ์ที่ยังไม่ได้ติดตั้ง ด้วย-amมันจะสร้างคลังน้ำมันโดยไม่จำเป็น
อ่างล้างหน้า

18

กล่าวว่าผู้ปกครอง pom.xml มี 6 โมดูลและคุณต้องการเรียกใช้, BและF

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1- cd ลงในโปรเจคหลัก

 mvn --projects A,B,F --also-make clean install

หรือ

mvn -pl A,B,F -am clean install

หรือ

mvn -pl A,B,F -amd clean install

หมายเหตุ:เมื่อคุณระบุโครงการที่มีตัวเลือก-am Maven จะสร้างโครงการทั้งหมดที่โครงการที่ระบุขึ้นอยู่กับ (ไม่ว่าโดยตรงหรือโดยอ้อม) Maven จะตรวจสอบรายการของโครงการและเดินลงไปตามต้นไม้อ้างอิงเพื่อค้นหาโครงการทั้งหมดที่จำเป็นต้องสร้าง

ในขณะที่คำสั่ง-amสร้างโปรเจ็กต์ทั้งหมดที่ต้องการโดยโปรเจ็กต์เฉพาะในการสร้างหลายโมดูลตัวเลือก-amdหรือ--also-make-dependentsกำหนดคอนฟิก Maven เพื่อสร้างโปรเจ็กต์และโปรเจ็กต์ใด ๆ ที่ขึ้นอยู่กับโปรเจ็กต์นั้น เมื่อใช้- ยังเป็นผู้ติดตามเท่านั้น Maven จะตรวจสอบโครงการทั้งหมดในเครื่องปฏิกรณ์ของเราเพื่อค้นหาโครงการที่ขึ้นอยู่กับโครงการเฉพาะ มันจะสร้างโครงการเหล่านั้นโดยอัตโนมัติและไม่มีอะไรอื่น


8

Maven ถูกออกแบบมาสำหรับการพึ่งพาประเภทนี้อย่างแน่นอน

mvn package จะไม่ติดตั้งอะไรในพื้นที่เก็บข้อมูลในพื้นที่ของคุณเพียงแค่แพ็คเกจโครงการและเก็บไว้ในโฟลเดอร์เป้าหมาย

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

คุณเพียงแค่ต้องmvn installในโครงการแม่ถ้าคุณปรับปรุงบางส่วนของรหัส


3
มันจะเป็นฝันร้ายในระหว่างการพัฒนาอิมเมจที่เมื่อคุณทำการแก้ไขในโมดูลย่อยคุณจะต้องติดตั้งแล้วคุณจะเริ่มต้นคอนเทนเนอร์ servlet ชีวิตสั้น :(
hguser

7

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

คุณสามารถกำหนดโครงการหลายโมดูลด้วย aggregator pom เพื่อสร้างชุดของโครงการ

นอกจากนี้ยังเป็นเรื่องที่คุ้มค่าที่จะกล่าวถึงm2eclipseซึ่งจะรวม Maven เข้ากับ Eclipse และช่วยให้คุณสามารถแก้ไขการพึ่งพาจากเวิร์กสเปซ ดังนั้นหากคุณแฮ็คไปหลายโครงการเนื้อหาของพื้นที่ทำงานจะถูกใช้เพื่อรวบรวม เมื่อคุณพอใจกับการเปลี่ยนแปลงของคุณแล้วให้เรียกใช้การติดตั้ง mvn (ในแต่ละโครงการหรือใช้ตัวรวบรวม) เพื่อวางไว้ในที่เก็บในเครื่องของคุณ


1
มีวิธีง่าย ๆ ในการรับประกันว่ามีการติดตั้งโครงการทั้งหมดสำหรับโครงการเป้าหมายของฉันหรือไม่? ลำดับชั้นที่ฉันมีซับซ้อนกว่าที่อธิบายไว้ที่นี่จริง ๆ ดังนั้นโปรดจำไว้ว่าถ้าฉันเรียกใช้ mvn ติดตั้งสำหรับแต่ละโครงการที่ต้องพึ่งพาเนื่องจากฉันได้ทำการเปลี่ยนแปลงรหัสครั้งล่าสุดอาจมีความยุ่งยาก
Brian Ferris

ใช่ใช้โมดูลเพื่อสร้างชุดโครงการดูลิงค์ที่เพิ่มเข้าไปในคำตอบเดิม
ผู้ขายที่สมบูรณ์

5

ลองดูที่คำตอบของฉันMaven และโมดูลที่ขึ้นต่อกัน

ปลั๊กอิน Maven ปฏิกรณ์ถูกออกแบบมาเพื่อจัดการกับการสร้างส่วนหนึ่งของโครงการ

reactor:makeเป้าหมายโดยเฉพาะอย่างยิ่งที่คุณจะต้องการที่จะใช้มัน


3
นี่เคยเป็นคำตอบที่ถูกต้อง แต่ด้วย Maven 2.1 คุณไม่จำเป็นต้องใช้ปลั๊กอินเครื่องปฏิกรณ์อีกต่อไป ดูคำตอบของ Pascal ในหัวข้อนี้ที่เกี่ยวข้องกับ "Advanced Reactor Options"
Spedge

3

คุณบอกว่าคุณ "ต้องการเพียงแค่ B" แต่นี่เป็นเท็จ คุณต้องการ B แต่คุณต้องการอัปเดต A หากมีการเปลี่ยนแปลงใด ๆ ("การพัฒนาที่ใช้งานอยู่")

ดังนั้นบางครั้งคุณต้องการทำงานกับ A, B และ C สำหรับกรณีนี้คุณมีโครงการรวบรวม P สำหรับกรณีที่คุณต้องการทำงานกับ A และ B (แต่ไม่ต้องการ C) คุณควรสร้างโครงการรวบรวม Q .

แก้ไข 2016 : ข้อมูลข้างต้นอาจมีความเกี่ยวข้องในปี 2009 ณ ปี 2559 ฉันขอแนะนำให้ไม่สนใจสิ่งนี้ในกรณีส่วนใหญ่และเพียงใช้แฟล็ก-amหรือ-plบรรทัดคำสั่งตามที่อธิบายไว้ในคำตอบที่ยอมรับ หากคุณใช้ maven เวอร์ชันก่อนหน้า v2.1 ให้เปลี่ยนก่อน :)


Grmphh ... จากนั้นฉันจะจบลงด้วยโครงการรวบรวมจำนวนมากเป็นโครงการ
กริช

@Kris ฉันจะไม่แนะนำสิ่งนี้อีกต่อไป ฉันจะทิ้งไว้ที่นี่ในกรณีที่มีคนยังต้องการทราบวิธี แต่ฉันมักจะใช้ธง -am และ -pl ตอนนี้ ฉันอัพเดตคำตอบแล้ว
Zac Thompson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.