Maison >Java >javaDidacticiel >JeKa : le moyen le plus simple de créer des pots Uber et Shade

JeKa : le moyen le plus simple de créer des pots Uber et Shade

Barbara Streisand
Barbara Streisandoriginal
2025-01-04 09:37:35628parcourir

JeKa: The Simplest Way to Create Uber and Shade Jars

JeKa est un outil de construction Java moderne axé sur la simplicité.

Cet article fait partie de la série "Jeka : la manière la plus simple de..." et montre comment créer un pot de graisse (ombré ou non) sans effort.

Pour les applications : Pot de graisse simple

Une méthode courante pour empaqueter des applications Java consiste à créer des fichiers FAT. Un gros pot regroupe toutes les classes des dépendances, vous n'avez donc besoin que du pot (avec le Java Runtime) pour exécuter l'application.

Votre application peut avoir besoin de dépendances, que vous pouvez lister dans le fichier dependencies.txt comme indiqué dans l'exemple ci-dessous :

== COMPILE ==
com.github.lalyos:jfiglet:0.0.9
com.google.guava:guava:33.4.0-jre
com.fasterxml.jackson.core:jackson-core:2.18.2


== TEST ==
org.junit.jupiter:junit-jupiter:5.8.1

Pour configurer la génération du fat jar, éditez le fichier jeka.properties :

jeka.version=0.11.11
jeka.java.version=17

@project.pack.detectMainClass=true
@project.pack.jarType=FAT

La propriété @project.pack.jarType spécifie le type de JAR à générer. Il peut être RÉGULIER, FAT ou SHADE.

Le paramètre @project.pack.detectMainClass=true demande à Jeka de détecter la classe principale à inclure dans le fichier manifeste.

Pour générer le jar, exécutez la commande suivante :

jeka project: pack

Le pot FAT sera créé dans le répertoire jeka-output. Pour l'exécuter, exécutez simplement : java -jar [jar-name].jar.

Pour les bibliothèques : pot Shade Fat

Pour les bibliothèques, une bonne pratique consiste à conserver un Jar ordinaire et à prévoir un Fat Jar en option supplémentaire.

Idéalement, les classes de dépendance devraient également être déplacées vers un package spécifique pour éviter les conflits de chemin de classe pour les consommateurs. Nous appelons un pot shade, un pot fat où les classes de dépendances ont été relocalisées dans un package spécifique.

Pour créer un tel pot, configurez JeKa comme suit :

jeka.version=0.11.11
jeka.java.version=17

@project.moduleId=org.examples:my-lib
@project.version=1.0.0-SNAPSHOT
@project.pack.shadeJarClassifier=all

@maven.publication.extraArtifacts=all

Maintenant, invoquer jeka prpject: pack créera également un fichier*org.examples.my-lib-all.jar*.
En ouvrant le fichier jat, nous pouvons voir que toutes les classes de dépendances ont été automatiquement relocalisées.

.
├── org                  
│   └── example             
│       └── mylib           <- Base package for my-lib classes
│           ├── MyLyb.class   
│           └── _shaded     <- Base package for dependency classes
│               ├── com.google...
│               ├── com.fasterxml.jackson...
│               └── com.github.lalyos.jfiglat...
└── META-INF             
    └── MANIFEST.MF      

De plus, @maven.publication.extraArtifacts=all inclut le pot de nuances dans la publication maven générée par jeka maven : commande de publication.

Comparaison Maven

Comme indiqué ci-dessous, Maven nécessite beaucoup plus de frappe pour atteindre un objectif similaire.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>


    <groupId>org.examples</groupId>
    <artifactId>my-lib</artifactId>
    <version>0.1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.github.lalyos</groupId>
            <artifactId>jfiglet</artifactId>
            <version>0.0.9</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>33.2.1-jre</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.17.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <!-- Run shade goal on package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <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>com.google.guava:guava</include>
                                <include>com.github.lalyos:jfiglet</include>
                                <include>com.fasterxml.jackson.core:jackson-core</include>
                            </includes>
                        </artifactSet>
                        <relocations>
                            <relocation>
                                <pattern>com.google.common</pattern>
                                <shadedPattern>org.elasticsearch.common</shadedPattern>
                            </relocation>
                            <relocation>
                                <pattern>com.fasterxml.jackson</pattern>
                                <shadedPattern>org.elasticsearch.common.jackson</shadedPattern>
                            </relocation>
                        </relocations>
                        <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>
            </plugins>
        </pluginManagement>
    </build>

</project>

Conclusion

Jeka facilite considérablement la création de projets Java, avec une configuration minimale par rapport à Maven ou Gradle.

Explorez d'autres exemples pour découvrir comment Jeka peut s'adapter aux besoins de votre projet !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn