Konfigurasi plugin Maven Shade untuk membuat uber jar yang hanya berisi submodul yang berbasis di groupId yang sama
Memiliki situasi berikut:
- STS
- Jawa
- Maven
Mesin Satu
ruang kerja-01
aplikasi Java dengan Maven didasarkan pada satu modul. Itu diinstal ( mvn install
) di repositori dan master-project.jar
file di Mesin lain diinstal dan digunakan untuk proyek lain bagaimana caranya
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
Sampai disini semua bekerja dengan baik
ruang kerja-02
Aplikasi tumbuh dan di ruang kerja lain aplikasi dipindahkan untuk bekerja dengan multi-modul
Mari kita asumsikan struktur berikut untuk kesederhanaan
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>)
Saya bisa mengkompilasi semua modul ini. Oleh karena itu bangunlah kesuksesan
Tujuan
Sekarang tujuannya adalah menghasilkan master-project.jar
file yang sama termasuk sub modul berapa internal jars.
Setelah melakukan penelitian solusinya adalah: maven-shade-plugin
- Untuk apa maven-shade-plugin digunakan, dan mengapa Anda ingin merelokasi paket Java?
Saya memiliki konfigurasi berikut (bagian darinya) menggunakan referensi tautan berikut dan sumber lain:
- Buat file JAR sebagai Agregasi dalam paket multi modul maven
Karena itu:
<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>
Dengan konfigurasi saat ini terjadi hal berikut:
Untuk setiap modul di dalam target
direktori:
- Dengan
<packaging>pom</packaging>
menghasilkan.pom
file - Dengan
<packaging>jar</packaging>
menghasilkan dua.jar
file, satu dari sub modul itu sendiri dan yang lainnya dari uber jar (ya untuk setiap modul)
Sasaran: apa konfigurasi tambahan atau yang hilang untuk menghasilkan sesuatu seperti ini:
master-project.jar containing
module1.jar
module2.jar
...
module3.jar
Dimana masing module#
- masing memiliki <groupId>com.manuel.jordan</groupId>
deklarasi yang sama , itulah mengapa saya menyatakan
<configuration>
<artifactSet>
<includes>
<include>com.manuel.jordan</include>
</includes>
</artifactSet>
</configuration>
Dan amati bahwa root / pom.xml
file utama memiliki<packaging>pom</packaging>
Tujuan
Oleh karena itu, tujuannya adalah agar proyek lain yang terletak di mesin lain tetap aman
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
Jadi tidak masalah jika master-project
proyek itu tunggal atau multi-modul
Jawaban
Anda dapat membuat modul kemasan jar di bawah proyek master Anda dengan ketergantungan ke modul lain, dan hanya menyertakan di sana konfigurasi plugin shade