12 Aralık 2021 Pazar

shade plugin - Fat Jar Üretir

Giriş
Fat jar oluşturmak için
1. maven-dependency-plugin ile dll dosyaları isim değiştirerek edilerek target dizinine taşınır
2. maven-resources-plugin ile diğer gerekli dosyalar target dizinine taşınır
3. maven-shade-plugin ile fat jar target dizininde oluşturulur
  3.1 shade plugin için fat jar'a dahil edilmeyecek dosyalar configuration/filters/filter/exclude tag'i altında belirtilir.
  3.2 Transformers kullanılarak mainClass ve diğer şeyler belirtilir.
4. maven-assembly-plugin ile target dizinindeki bu dosyalar ziplenir.

shade goal

Örnek - AWS Lambda
Şöyle yaparız. Burada projede başka bir dependency vs olmadığı için sadece fat jar üretiliyor.
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>3.2.2</version>
  <configuration>
    <createDependencyReducedPom>false</createDependencyReducedPom>
  </configuration>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
    </execution>
  </executions>
</plugin>
shadedPattern Kullanımı

ManifestResourceTransformer Kullanımı
mainClass belirtilir

ServicesResourceTransformer Kullanımı
Örnek
Farklı transformer için şöyle yaparız. Burada ServicesResourceTransformer kullanılarak MANIFEST/services dosyaları birleştiriliyor.
<transformers>
  <transformer
    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
    <mainClass>com.grpc.hello.App</mainClass>
  </transformer>

  <transformer
    implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer">
  </transformer>

</transformers>
Exclude Filter Kullanımı
Jar dosyalarının içindeki imza dosyalarını hariç bırakmak gerekiyor, yoksa java.lang.SecurityException fırlatılıyor

Örnek
Şöyle yaparız. shadedArtifactAttached ne işe yarıyor bilmiyorum
<plugin>
  <artifactId>maven-shade-plugin</artifactId>
  <version>3.2.1</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <transformers>
          <transformer
            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"/>
          </transformers>
          <filters>
            <filter>
              <artifact>*:*</artifact>
              <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
              </excludes>
            </filter>
          </filters>
        <shadedArtifactAttached>true</shadedArtifactAttached>
      </configuration>
    </execution>
  </executions>
</plugin>

Örnek
Şöyle yaparız. Burada createDependencyReducedPom false verilerek dependency-reduced-pom.xml isimli dosyanın üretilmesi engelleniyor. Bu dosyada fat jar tarafından kullanılan ancak fat jar içinde olmayan dependency'ler yazılır. Örneğin bir projede bu dosyada lombok yazılıydı.
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>2.2</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
        <transformers>
          <transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>com.grpc.hello.App</mainClass>
          </transformer>
        </transformers>
        <filters>
          <filter>
            <artifact>*.*<artifact>
            <excludes>
              <exclude>META-INF/*.SF</exclude>
              <exclude>META-INF/*.DSA</exclude>
              <exclude>META-INF/*.RSA</exclude>
            </excludes>
          </filter>
        </filters>
      </configuration>
    </execution>
  </executions>
</plugin>
Örnek
Şöyle yaparız. Burada farklı olarak manifestEntries tag'i altında Main sınıfı belirtiliyor.
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>2.3</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <transformers>
          <transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <manifestEntries>
              <Main-Class>com.grpc.hello.App</Main-Class>
            </manifestEntries>
          </transformer>
        </transformers>
        <artifactSet />
      </configuration>
    </execution>
  </executions>
</plugin>
artifactSet Kullanımı
Örnek 
Şöyle yaparız
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>2.1</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <minimizeJar>true</minimizeJar>
    <artifactSet>
      <includes>
        <include>org.apache.commons:commons-lang3</include>
      </includes>
    </artifactSet>
    <filters>
      <filter>
        <artifact>*:*</artifact>
        <excludes>
          <exclude>META-INF/license/**</exclude>
          <exclude>META-INF/*</exclude>
          <exclude>META-INF/maven/**</exclude>
          <exclude>LICENSE</exclude>
          <exclude>NOTICE</exclude>
          <exclude>/*.txt</exclude>
          <exclude>build.properties</exclude>
        </excludes>
      </filter>
    </filters>
  </configuration>
</plugin>
Açıklaması şöyle
The above pom.xml creates an uber jar by including the commons-lang3 dependency, also it is excluding the unwanted files inside the META-INF and other folders as based on the configuration.

Hiç yorum yok:

Yorum Gönder

Local Snapshot Kullanmak

Örnek Şöyle yaparız <repository> <id>snapshot-repository</id> <name>Maven2 Snapshot Repository</name> &l...