ข้าม submodule ระหว่างการสร้าง Maven


160

เราจำเป็นต้องสามารถข้าม submodule ในสภาพแวดล้อมบางอย่าง

โมดูลที่เป็นปัญหาประกอบด้วยการทดสอบการรวมและใช้เวลาครึ่งชั่วโมงในการรัน ดังนั้นเราต้องการรวมไว้เมื่อสร้างบนเซิร์ฟเวอร์ CI แต่เมื่อนักพัฒนาสร้างในเครื่อง (และทดสอบเรียกใช้) เราต้องการข้ามโมดูลนั้น

มีวิธีทำเช่นนี้กับการตั้งค่าโปรไฟล์หรือไม่? ฉันทำ googling แล้วและดูคำถาม / คำตอบอื่น ๆ ที่นี่และไม่พบวิธีแก้ไขปัญหาที่ดี

ฉันคิดว่าตัวเลือกหนึ่งคือการลบ submodule นั้นจากผู้ปกครองpom.xmlทั้งหมดและเพียงเพิ่มโครงการอื่นบนเซิร์ฟเวอร์ CI ของเราเพื่อสร้างโมดูลนั้น

ข้อเสนอแนะ?


ทำไมไม่ Maven Way เป็นการเรียกร้องที่ถูกต้องสมบูรณ์แบบสำหรับฉัน
MaDa

อืมมม ตอนนี้ฉันไม่สามารถหาสถานที่ที่ผู้คนดูเหมือนจะเถียงกับเรื่องนี้ ... ดังนั้นฉันจึงได้อัปเดตคำถามดั้งเดิมของฉันเพื่อลบการอ้างสิทธิ์ของฉันว่านี่ไม่ใช่ "The Maven Way"
denishaskin

คำตอบ:


149

แน่นอนว่าสามารถทำได้โดยใช้โปรไฟล์ คุณสามารถทำสิ่งต่อไปนี้ใน parent pom.xml ของคุณ

  ...
   <modules>
      <module>module1</module>
      <module>module2</module>  
      ...
  </modules>
  ...
  <profiles>
     <profile>
       <id>ci</id>
          <modules>
            <module>module1</module>
            <module>module2</module>
            ...
            <module>module-integration-test</module>
          </modules> 
      </profile>
  </profiles>
 ...

ใน CI ของคุณคุณจะเรียกใช้ciโปรไฟล์ด้วยเช่นmvn -P ci clean install


4
คำตอบที่ยอดเยี่ยม! ฉันไม่รู้ว่าทำไมฉันจึงมีปัญหามากมายในการค้นหาสิ่งนี้จากเอกสาร Maven ข้อเสนอแนะข้อเดียวที่ฉันจะทำคือเนื่องจากฉันต้องการให้การทดสอบการรวมระบบทำงานโดยค่าเริ่มต้นฉันเพิ่มactiveByDefaultในโปรไฟล์นั้นและจากนั้นต้องเพิ่มโปรไฟล์ว่างเปล่าอีกหนึ่ง (เช่นskip-integration-tests) เพื่อให้สามารถข้ามได้
denishaskin

7
มีวิธีการทำเช่นนี้โดยไม่ทำซ้ำสิ่งที่ใช้ร่วมกันทั้งหมดหรือไม่
JonnyRaa

7
ระวังถ้าคุณใช้ maven-release-plugin มันจะปรากฏขึ้นว่าจะไม่อัปเดตหมายเลขรุ่นของ submodules ที่ซ่อนอยู่หลังสวิตช์โปรไฟล์ คุณสามารถมีโมดูลย่อยที่มีหมายเลขรุ่นที่แตกต่างกันในส่วนที่เหลือของโครงการของคุณ ...
Ardesco

8
น่าเสียดายที่ uing โปรไฟล์ที่คุณไม่สามารถยกเว้นโมดูลที่กล่าวถึงก่อนหน้านี้ในส่วน <modules> หลักของ pom JIRA problems.apache.org/jira/browse/MNG-5230 (และโครงสร้าง pom ทั้งหมด) สามารถนำไปใช้งานได้อย่างเต็มที่ดียิ่งขึ้นด้วยความคิดที่รอบคอบมากขึ้นเล็กน้อย
Ed Randall

2
วิธีนี้ใช้งานได้จริงหรือ อย่างน้อยฉันก็ไม่สามารถทำงานได้ ดูเหมือนว่าฉันมีปัญหาเดียวกันเช่น @EdRandall
Gerros

232

Maven เวอร์ชัน 3.2.1 เพิ่มคุณสมบัตินี้คุณสามารถใช้-plสวิตช์ ( ทางลัดสำหรับ--projectsรายการ) กับ!หรือ-( แหล่งที่มา ) เพื่อยกเว้นการส่งบางอย่าง

mvn -pl '!submodule-to-exclude' install
mvn -pl -submodule-to-exclude install

ระมัดระวังในการทุบตีตัวละคร! เป็นตัวละครพิเศษดังนั้นคุณต้องอ้างมัน (เช่นเดียวกับฉัน) หรือหลบหนีด้วยอักขระแบ็กสแลช

ไวยากรณ์เพื่อแยกหลายโมดูลเหมือนกับการรวม

mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install

แก้ไข Windows ดูเหมือนจะไม่ชอบคำพูดเดียว แต่มันเป็นสิ่งจำเป็นในการทุบตี; ใน Windows ให้ใช้เครื่องหมายคำพูดคู่ (ขอบคุณ @awilkinson)

mvn -pl "!submodule1,!submodule2" install

27
ข้อสำคัญ: หากคุณต้องการยกเว้น submodule ที่ซ้อนกันคุณต้องใช้เวอร์ชันที่ผ่านการรับรองmvn -pl !com.acme:nestedmodule1
Leonard Brünings

3
ตัวเลือก -pl ต้องการ '[groupId]:' ก่อน artifactId ดังนั้นเราจึงควรใช้ mvn -pl '!: submodule-to-แยกไม่รวม' ติดตั้ง
Honsen

4
คุณยังสามารถใช้mvn -pl '!path/to/submodule/directory'โดยไม่ต้องใช้ groupId และ artifactId คำตอบของฉันทำงานหากsubmodule1และsubmodule2อยู่ในไดเรกทอรีปัจจุบัน
Alexandre DuBreuil

นอกจากนี้ยังไม่มีอะไรคุ้มค่าว่าถ้าคุณใช้-plในmvn installคุณอาจจะต้องใช้มันmvn deployได้เป็นอย่างดี
majikman

39

เป็นไปได้ที่จะตัดสินใจว่าเครื่องปฏิกรณ์โครงการใดที่จะสร้างโดยการระบุ-plอาร์กิวเมนต์บรรทัดคำสั่ง:

$ mvn --help
[...]
 -pl,--projects <arg>                   Build specified reactor projects
                                        instead of all projects
[...]

ยอมรับรายการพารามิเตอร์คั่นด้วยเครื่องหมายจุลภาคในหนึ่งในรูปแบบต่อไปนี้:

  • เส้นทางสัมพัทธ์ของโฟลเดอร์ที่มี POM
  • [groupId]:artifactId

ดังนั้นกำหนดโครงสร้างต่อไปนี้:

project-root [com.mycorp:parent]
  |
  + --- server [com.mycorp:server]
  |       |
  |       + --- orm [com.mycorp.server:orm]
  |
  + --- client [com.mycorp:client]

คุณสามารถระบุบรรทัดคำสั่งต่อไปนี้:

mvn -pl .,server,:client,com.mycorp.server:orm clean install

เพื่อสร้างทุกอย่าง ลบองค์ประกอบในรายการเพื่อสร้างเฉพาะโมดูลที่คุณต้องการ


แก้ไข: ตามที่blackbuildชี้ให้เห็นว่า Maven 3.2.1 คุณมีการ-elตั้งค่าสถานะใหม่ที่ไม่รวมโครงการจากเครื่องปฏิกรณ์คล้ายกับสิ่งที่ -plทำ:


2
ขอบคุณ นี้ทำงานได้ดีสำหรับฉัน. นอกจากนี้โปรดทราบว่าคุณสามารถเพิ่ม "-am" (AKA "--also-make") เพื่อสร้างโครงการที่โมดูลที่คุณระบุไว้ต้องการ
GaZ

1
ที่ดี! ฉันใช้mvn install -pl .เพื่อติดตั้ง pom พาเรนต์เฉพาะใน repo ท้องถิ่นโดยไม่ต้องสร้างโมดูล
Marcin

ดูที่jira.codehaus.org/browse/MNG-5230ด้วย ตอนนี้คุณสามารถแยกโครงการออกจากเครื่องปฏิกรณ์
blackbuild

1
ลิงก์ MNG-5230 นับตั้งแต่ codehaus.org ปิด: problems.apache.org/jira/browse/MNG-5230
Ed Randall

น่าเสียดายที่มันใช้งานไม่ได้เช่นถ้าฉันมี top / mod1 / mod2 และ build จากด้านบน -pl '! mod2' จะทำให้เกิดข้อผิดพลาด
zakmck

4

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

สมมติว่าโครงการของคุณมีโครงสร้างเป็น:

project-root
  |
  + --- ci
  |
  + --- client
  |
  + --- server

project-root/pom.xmlโมดูลกำหนด

<modules>
  <module>ci</module>
  <module>client</module>
  <module>server</module>
</modules>

ci/pom.xmlโปรไฟล์กำหนดเช่น:

... 
<profiles>
  <profile>
    <id>default</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>true</skip>
       </configuration>
     </plugin>
  </profile>
  <profile>
    <id>CI</id>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>false</skip>
       </configuration>
     </plugin>
  </profile>
</profiles>

สิ่งนี้จะส่งผลให้ Maven ข้ามการทดสอบในโมดูลนี้ยกเว้นเมื่อตั้งชื่อโปรไฟล์ CIใช้งานอยู่ เซิร์ฟเวอร์ CI mvn clean package -P CIของคุณจะต้องได้รับคำแนะนำในการดำเนินการ เว็บไซต์ Maven มีคำอธิบายในเชิงลึกของกลไกโปรไฟล์


2

ขณะนี้มี (จากรุ่น 1.1.1) ธง 'ข้าม' ในหลุม

ดังนั้นคุณสามารถทำสิ่งต่าง ๆ เช่น:

    <profile>
        <id>pit</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.pitest</groupId>
                    <artifactId>pitest-maven</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

ในโมดูลของคุณและพิทจะข้าม

[INFO] --- pitest-maven: 1.1.3: mutationCoverage (default-cli) @ module-selenium --- [INFO] การข้ามโครงการ

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