การแชร์คลาส src / ทดสอบระหว่างโมดูลในโครงการ maven แบบหลายโมดูล


120

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

  • data
  • consumer

โมดูลconsumerมีโมดูลdataเป็นที่พึ่งพา

โมดูลdataประกาศกลุ่มของคลาสหลัก มีการทดสอบภายใต้การsrc/testใช้งานนั้น การทดสอบเหล่านี้จำเป็นต้องมีการสร้างวัตถุที่ยืดยาวดังนั้นฉันจึงมีคลาสที่มีวิธียูทิลิตี้บางอย่างอยู่ในนั้นเพื่อสร้างวัตถุเหล่านี้ คลาสยูทิลิตี้นี้ ( SampleDataHelper) อยู่ในsrc/testลำดับชั้น

ฉันยังมีการทดสอบบางอย่างในconsumerโมดูลที่จำเป็นต้องสร้างวัตถุที่ยืดยาวเหล่านี้ ฉันต้องการใช้SampleDataHelperคลาสของฉัน(กำหนดไว้ในdata src/test) ในการทดสอบที่อยู่ในconsumer src/testโครงสร้างของฉัน แต่น่าเสียดายที่แม้dataเป็นพึ่งพาของconsumer, ไม่สามารถดูชั้นเรียนที่มีอยู่ภายใต้consumerdata src/test

เพื่อต่อสู้กับสิ่งนี้ฉันคิดว่าฉันอาจสร้างโมดูลอื่น ( data-test) และย้ายSampleDataHelperไปที่ด้านsrc/mainล่าง จากนั้นฉันจะรวมdata-testเป็นการอ้างอิงขอบเขตการทดสอบของdata. น่าเสียดายที่สิ่งนี้แนะนำการพึ่งพาแบบวงกลม: dataใช้data-testแต่data-testต้องใช้dataด้วย

ทางออกเดียวที่ฉันคิดขึ้นคือวางSampleDataHelperไว้data src/mainใต้testแพ็คเกจและหวังว่าจะไม่มีรหัสแอปพลิเคชันจริงที่เรียกว่า

ฉันจะแบ่งปันSampleDataHelperชั้นเรียนระหว่างโมดูลโดยไม่ต้องใส่ไว้ข้างใต้ได้src/mainอย่างไร


1
ลองดูคำตอบนี้ ฉันคิดว่ามันน่าจะช่วยคุณได้
Andrew Logvinov


@AndrewLogvinov: คำตอบที่เชื่อมโยงของคุณไม่จำเป็นต้องมีการสร้าง "สองขั้นตอน" หรือไม่? ในการสร้างและปรับใช้หนึ่งโมดูล ( data) ก่อนที่ฉันจะคอมไพล์โมดูลที่สองของฉัน ( consumer)
Greg Kopff

ฉันคิดว่าคุณอาจจะเจอปัญหาบางอย่างถ้าคุณใช้mvn packageแต่มันควรจะทำงานได้ดีในขั้นตอนการสร้างเพียงครั้งเดียวเมื่อคุณใช้หรือmvn install mvn deployเพียงบันทึกสั้น ๆ ในโครงการขนาดใหญ่โครงการหนึ่งของเราเรามีกระดาษห่อหุ้มของจูนิทTestBaseและตั้งอยู่src/mainซึ่งฉันก็ไม่คิดว่าจะเป็นความคิดที่ดีเช่นกัน
Andrew Logvinov

คำตอบ:


152

โครงการผู้บริโภคของคุณขึ้นอยู่กับโครงการข้อมูลของคุณดังนั้นเราจึงยินดีที่ข้อมูลจะต้องถูกสร้างขึ้นก่อนผู้บริโภค ด้วยเหตุนี้การใช้เทคนิคที่แนะนำในความคิดเห็นฉันจะตรวจสอบให้แน่ใจว่าโครงการข้อมูลของคุณมีรหัสทดสอบทั้งหมดที่คุณต้องการแชร์และกำหนดค่า POM เพื่อสร้าง JAR ทดสอบ:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.2</version>
  <executions>
    <execution>
      <goals>
        <goal>test-jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>

จากนั้นโปรเจ็กต์ Consumer ของคุณจะขึ้นอยู่กับอาร์ติแฟกต์ Data JAR ปกติรวมถึงอาร์ติtest-jarแฟกต์เพิ่มเติมพร้อมขอบเขตการทดสอบ:

<dependency>
  <groupId>com.foo</groupId>
  <artifactId>data</artifactId>
  <version>1.0</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

ฉันใช้แนวทางนี้หลายครั้งและได้ผลดี


1
เกี่ยวกับ "โครงการผู้บริโภคของคุณจะขึ้นอยู่กับทั้งส่วนของ Data JAR ปกติรวมทั้งส่วนของ test-jar artifact เพิ่มเติม" เมื่อฉันเพิ่มการอ้างอิงของข้อมูลลงในผู้บริโภค (สมมติว่าสิ่งประดิษฐ์ของฉันชื่อ data & consumer ด้วย) pom ไม่มีข้อกำหนดเฉพาะรุ่นปอมมีข้อผิดพลาด เหตุใดจึงเกิดขึ้น
Johnny

@StasS น่าจะดีที่สุดที่คุณจะเปิดคำถามแยกต่างหากเกี่ยวกับเรื่องนี้
Duncan Jones


1

ดังนั้นปัญหาคือการทดสอบ (บางส่วน) ในdataโมดูลขึ้นอยู่กับSampleDataHelperคลาส? คุณสามารถย้ายSampleDataHelperคลาสไปsrc/mainยังdata-testโมดูลได้หากคุณย้ายการทดสอบ (ซึ่งขึ้นอยู่กับคลาสเฉพาะ) ไปsrc/testที่data-testโมดูลในเวลาเดียวกัน ดังนั้นจะไม่มีการอ้างอิงแบบวงกลมอีกต่อไป


1
ถ้าผมเข้าใจคุณคุณกำลังบอกว่าการทดสอบใด ๆ ที่ใช้SampleDataHelperถูกย้ายจากทั้งdataโมดูลหรือconsumerโมดูล (ตามความเหมาะสม) data-testลงใน น่าเสียดายที่ฉันไม่พบวิธีแก้ปัญหาที่ "เรียบร้อย" มากนักเนื่องจากจะย้ายการทดสอบของฉันออกจากโมดูลที่ทดสอบและไปยังโซลูชันอื่น (พูดอย่างเคร่งครัดคุณแค่บอกว่าจะย้ายการdataทดสอบ แต่ฉันคิดว่าฉันพบว่าตัวเองต้องย้ายทั้งสองอย่างเพื่อความสม่ำเสมอ) แต่ขอบคุณสำหรับคำตอบ :-)
Greg Kopff

1
ใช่คุณเข้าใจฉันถูกต้อง และเนื้อหาเป็นวิธีแก้ปัญหาที่รวดเร็วมากกว่าวิธีที่เรียบร้อย :-)
matsev

ฉันคิดว่าการอ้างอิงแบบวงกลมจะยังคงอยู่ สมมติว่าการทดสอบที่เป็นปัญหาใช้ชั้นเรียนที่กำหนดไว้ในโครงการข้อมูลยังคงต้องมีการอ้างอิงกลับไปยังโครงการข้อมูลจากโครงการทดสอบข้อมูล
Duncan Jones

1
@DuncanJones ขออภัยมีการพิมพ์ผิดเล็กน้อยในโพสต์ของฉัน ประเด็นที่ฉันพยายามทำคือdata-testโมดูลควรขึ้นอยู่กับdataโมดูล (ไม่ใช่วิธีอื่น ๆ ) เพื่อหลีกเลี่ยงการพึ่งพาแบบวงกลมการทดสอบทั้งหมดที่อยู่ในdataโมดูลที่ใช้โมดูลนี้SampleDataHelperจะต้องถูกย้ายไปยังdata-testโมดูล
matsev

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