การกำหนดค่าปลั๊กอิน Maven Shade เพื่อสร้างโถ uber ที่มีเฉพาะโมดูลย่อยที่อยู่ใน groupId เดียวกัน

Aug 19 2020

มีสถานการณ์ต่อไปนี้:

  • รพ.สต.
  • Java
  • Maven

เครื่องที่หนึ่ง

พื้นที่ทำงาน -01

แอป Java ที่มี Maven ใช้สำหรับโมดูลเดียว มีการติดตั้ง ( mvn install) ในที่เก็บและmaster-project.jarไฟล์ในเครื่องอื่นได้รับการติดตั้งและใช้สำหรับโครงการอื่นอย่างไร

<dependency>
  <groupId>com.manuel.jordan</groupId>
  <artifactId>master-project</artifactId>
  <version>0.0.1.SNAPSHOT</version>
</dependency>

จนกระทั่งที่นี่ทำงานได้ดี

พื้นที่ทำงาน -02

แอปเติบโตขึ้นและในพื้นที่ทำงานอื่น ๆ แอปจะถูกย้ายไปทำงานกับหลายโมดูล

ให้สมมติโครงสร้างต่อไปนี้เพื่อความเรียบง่าย

master-project (<packaging>pom</packaging>)
alpha (<packaging>jar</packaging>)
beta (<packaging>jar</packaging>)
numbers (<packaging>pom</packaging>)
   one (<packaging>jar</packaging>)
   two (<packaging>jar</packaging>)
countries (<packaging>pom</packaging>)
   Europe (<packaging>pom</packaging>)
      France (<packaging>jar</packaging>)
      Italy (<packaging>jar</packaging>)
   AmericaLatina (<packaging>pom</packaging>)
      Peru (<packaging>jar</packaging>)
      Argentina (<packaging>jar</packaging>)

ฉันสามารถรวบรวมโมดูลเหล่านี้ทั้งหมดได้ จึงสร้างความสำเร็จ

เป้าหมาย

ตอนนี้เป้าหมายคือสร้างmaster-project.jarไฟล์เดียวกันรวมถึงโมดูลย่อยว่าไหภายใน

หลังจากทำการวิจัยวิธีแก้ปัญหาคือ: maven-shade-plugin

  • maven-shade-plugin ใช้สำหรับอะไรและทำไมคุณถึงต้องการย้ายแพ็คเกจ Java

ฉันมีการกำหนดค่าต่อไปนี้ (บางส่วน) โดยใช้วิธีอ้างอิงลิงค์ต่อไปนี้และแหล่งข้อมูลอื่น ๆ :

  • สร้างไฟล์ JAR เป็น Aggregation ใน maven multi module package

ดังนั้น:

  <modelVersion>4.0.0</modelVersion>
  <packaging>pom</packaging>  <--- it is the main or root pom.xml file

  <groupId>com.manuel.jordan</groupId>
  <artifactId>master-project</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <properties>
    ....
  </properties>

  <dependencies>
    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast-all</artifactId>
        <version>${hazelcast.version}</version>
        <scope>provided</scope> <!-- Otherwise each uber jar within each submodule is 11.6MB -->
    </dependency>
  </dependencies>

  <modules>
    <module>...</module>
    ...
  </modules>

  <build>
    <plugins>
      ....
      <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <id>create-fat-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <artifactSet>
                            <includes>
                                <include>com.manuel.jordan</include>
                            </includes>
                        </artifactSet>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
  </build>

ด้วยการกำหนดค่าปัจจุบันจะเกิดสิ่งต่อไปนี้:

สำหรับแต่ละโมดูลภายในtargetไดเร็กทอรี:

  • ด้วย<packaging>pom</packaging>สร้าง.pomไฟล์
  • ด้วยการ<packaging>jar</packaging>สร้าง.jarไฟล์สองไฟล์หนึ่งในโมดูลย่อยเองและอื่น ๆ ของโถ uber (ใช่สำหรับแต่ละโมดูล)

เป้าหมาย: การกำหนดค่าเพิ่มเติมหรือขาดหายไปในการสร้างสิ่งนี้คืออะไร:

master-project.jar containing
 module1.jar
 module2.jar
 ...
 module3.jar

ในที่ที่แต่ละคนmodule#มี<groupId>com.manuel.jordan</groupId>คำประกาศเหมือนกันนั่นคือเหตุผลที่ฉันประกาศ

<configuration>
   <artifactSet>
      <includes>
         <include>com.manuel.jordan</include>
      </includes>
   </artifactSet>
</configuration>

และสังเกตว่ารูท / pom.xmlไฟล์หลักมี<packaging>pom</packaging>

เป้าหมาย

ดังนั้นเป้าหมายคือโครงการอื่นที่อยู่ในเครื่องจักรอีกเครื่องหนึ่งจะอยู่ในความสงบ

<dependency>
  <groupId>com.manuel.jordan</groupId>
  <artifactId>master-project</artifactId>
  <version>0.0.1.SNAPSHOT</version>
</dependency>

ดังนั้นจึงไม่สำคัญว่าmaster-projectโครงการจะเป็นโมดูลเดียวหรือหลายโมดูล

คำตอบ

1 CésarAlves Sep 21 2020 at 23:43

คุณสามารถสร้างโมดูล jar บรรจุภัณฑ์ด้านล่างโปรเจ็กต์หลักของคุณโดยพึ่งพาโมดูลอื่น ๆ และรวมเฉพาะการกำหนดค่าปลั๊กอินเฉดสี