การพึ่งพาการทดสอบ Maven ในโครงการหลายโมดูล


86

ฉันใช้ maven เพื่อสร้างโครงการหลายโมดูล โมดูล 2 ของฉันขึ้นอยู่กับโมดูล 1 src ที่ขอบเขตการคอมไพล์และการทดสอบโมดูล 1 ในขอบเขตการทดสอบ

โมดูล 2 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>test</scope>
   </dependency>

ใช้งานได้ดี สมมติว่าโมดูล 3 ของฉันขึ้นอยู่กับ Module1 src และการทดสอบในเวลาคอมไพล์

โมดูล 3 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>compile</scope>
   </dependency>

เมื่อฉันรันบิลmvn clean installด์ของฉันจะทำงานจนถึงโมดูล 3 ล้มเหลวที่โมดูล 3 เนื่องจากไม่สามารถแก้ไขการพึ่งพาการทดสอบโมดูล 1 ได้ จากนั้นฉันทำmvn installในโมดูล 3 เพียงอย่างเดียวกลับไปและเรียกใช้mvn installกับปอมแม่ของฉันเพื่อสร้างมัน ฉันจะแก้ไขปัญหานี้ได้อย่างไร?


คุณช่วยเล่าให้ฟังได้ไหมว่าพ่อแม่ของคุณหน้าตาเป็นอย่างไร?
Chris Gummer

คำตอบ:


128

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

โปรดทราบว่ารุ่นก่อนหน้าของคู่มือนี้แนะนำให้ใช้แทน<classifier>tests</classifier> <type>test-jar</type>แม้ว่าสิ่งนี้จะใช้ได้ในบางกรณี แต่ก็ไม่สามารถทำงานได้อย่างถูกต้องในระหว่างการสร้างเครื่องปฏิกรณ์ของโมดูล JAR ทดสอบและผู้บริโภคใด ๆ หากมีการเรียกใช้เฟสวงจรการใช้งานก่อนการติดตั้ง ในสถานการณ์เช่นนี้ Maven จะไม่แก้ไข JAR ทดสอบจากเอาต์พุตของตัวสร้างเครื่องปฏิกรณ์ แต่มาจากที่เก็บโลคัล / รีโมต เห็นได้ชัดว่า JAR จากที่เก็บอาจล้าสมัยหรือขาดหายไปอย่างสมบูรณ์ทำให้การสร้างล้มเหลว (เปรียบเทียบMNG-2045 )

ดังนั้นก่อนอื่นในการจัดแพคเกจการทดสอบที่คอมไพล์ใน JAR และปรับใช้สำหรับการใช้ซ้ำทั่วไปให้กำหนดค่าmaven-jar-pluginดังนี้

<project>
  <build>
    <plugins>
     <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>
    </plugins>
  </build>
</project>

จากนั้นติดตั้ง / ปรับใช้ส่วนทดสอบ JAR ตามปกติ (โดยใช้mvn installหรือmvn deploy)

สุดท้ายในการใช้ JAR ทดสอบคุณควรระบุการอ้างอิงด้วยประเภทที่ระบุtest-jar:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project>

3
ปาสคาล ก่อนอื่นขอบคุณมากสำหรับการตอบคำถาม maven ทั้งหมด !! เกี่ยวกับคำถามนี้ ฉันยังคงมีปัญหา ฉันมีคลาส testBase อยู่ในโมดูลหลักของฉันที่ฉันต้องการใช้ในออบเจ็กต์ลูกทั้งหมด เรามีการสร้างมาเวนใน CI ของเรา หากฉันไม่ต้องการทำการติดตั้งการปรับใช้กับโถทดสอบและเพียงแค่ตรวจสอบสำเนาใหม่จาก trunk และรันการทดสอบ mvn สิ่งนี้ล้มเหลวเนื่องจากฉันยังไม่มีโถทดสอบเลย มีความคิดอย่างไรที่จะจัดการกับสิ่งนั้น?
โรมัน

@ โรมันรันการติดตั้งเป็นวิธี "ธรรมชาติ" แต่ดูเหมือนว่าคุณจะพบวิธีแก้ปัญหาชั่วคราว
Pascal Thivent

ดูเหมือนว่าจะเป็นฉบับที่ 3559 ไม่ใช่ปี 2045 ซึ่งถือเป็นประเด็นนี้: jira.codehaus.org/browse/MNG-3559
HDave

แม้ว่าสิ่งนี้จะอธิบายถึงสิ่งที่เกิดขึ้น แต่ก็ไม่ได้ให้วิธีแก้ปัญหา เพียงแค่แนะนำให้ทำสิ่งที่ OP (และเช่น I) กำลังทำอยู่
Antoniossss

19

เกี่ยวกับความคิดเห็นของฉันต่อคำถาม Pascals ฉันคิดว่าฉันได้พบคำตอบที่น่าเชื่อถือ:

<plugins>
    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.2</version>
        <executions>
            <execution>
            <goals>
                <goal>test-jar</goal>
            </goals>
            <phase>test-compile</phase>
        </execution>
        </executions>
        <configuration>
            <outputDirectory>${basedir}\target</outputDirectory>
        </configuration>
    </plugin>
</plugins>

ความแตกต่างหลักที่คุณเห็นที่นี่คือ<phase>แท็ก

ฉันจะสร้าง test-jar และจะพร้อมใช้งานในขั้นตอนการคอมไพล์ของการทดสอบและไม่เพียง แต่หลังจากแพ็กเกจเฟสเท่านั้น

ใช้ได้ผลสำหรับฉัน


1
ใช่สะดวกมาก ขอบคุณสำหรับการแบ่งปัน. ฉันเดาว่าวิธีการปรับใช้จะดีกว่าเมื่อคุณมีไดเรกทอรีขององค์กรเท่านั้น (ใช่ฉันรู้ว่าเราแนะนำอย่างยิ่ง ขอบคุณ @Roman
Damien

2

ตามที่https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.htmlพูดว่า:

วิธีสร้าง jar ที่มีคลาสทดสอบเมื่อคุณต้องการสร้าง jar ที่มีคลาสทดสอบคุณอาจต้องการใช้คลาสเหล่านั้นซ้ำ มีสองวิธีในการแก้ปัญหานี้:

  1. The easy way สร้าง jar ที่แนบมาพร้อมกับคลาสทดสอบจากโปรเจ็กต์ปัจจุบันและคลายการอ้างอิงขอบเขตการทดสอบสกรรมกริยา

  2. The preferred way สร้างโปรเจ็กต์แยกกับคลาสทดสอบ

โปรดอ่านบทความนั้นเพื่อดูรายละเอียด

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