Résumé des méthodes courantes de programmation Maven Packaging

table des matières

1. Introduction

二 、 package mvn

Trois, plug-in maven-assembly-plugin

3.1 Utilisation de base

3.2 Commandes d'emballage

Quatre, plug-in maven-ombre-plugin

4.1 Configuration de base

4.2 Commandes d'emballage

Cinq, autres exigences d'emballage

1. Utilisez Jar dans un référentiel non Maven

2. Excluez les fichiers Jars qui existent déjà dans le cluster

3. Empaquetez le fichier Scala

Référence


1. Introduction

Lorsque vous soumettez une tâche Big Data à exécuter sur le cluster, vous devez généralement d'abord regrouper le projet dans un package JAR. En prenant Maven comme exemple, les méthodes d'emballage courantes sont les suivantes:

  • N'ajoutez pas de plug-ins, utilisez directement le package mvn dans le package;

  • Utilisez le plug-in maven-assembly-plugin;

  • Utilisez le plug-in maven-shadow-plugin;

  • Utilisez les plug-ins maven-jar-plugin et maven-dependency-plugin;

Des descriptions détaillées sont données ci-dessous.

二 、 package mvn

POM ne branche aucune configuration, utilisation directe mvn packagepour les articles d'emballage, il n'est possible pour aucune dépendance externe du projet. Mais si le projet utilise un package JAR tiers, il y aura un problème, car le mvn packagecombat est dans le package JAR ne contient pas les dépendances, ne conduira pas à trouver un travail anormal dépendant d'un tiers. Cette méthode est plus limitée, car le projet proprement dit est souvent très compliqué et repose généralement sur un JAR tiers.

Les développeurs de framework Big Data prennent également en compte ce problème, donc tout le framework de base prend en charge l'utilisation lors de la soumission d'un travail --jarsdésigné des dépendances tierces, mais le problème avec cette approche est également clair est que vous devez maintenir l'environnement de production et l'environnement de développement Les versions de tous les packages JAR sont identiques, ce qui représente un coût de maintenance.

Pour ces raisons ci-dessus, la plus simple est l'utilisation du All In Onepackaging de réalisation, tous reposent sur un package dans un fichier JAR, donc une dépendance minimale vis-à-vis de l'environnement. Pour atteindre cet objectif, vous pouvez utiliser Maven fourni maven-assembly-pluginou des maven-shade-pluginplug-ins.

Trois, plug-in maven-assembly-plugin

AssemblyLe plug-in prend en charge l'empaquetage de toutes les dépendances et fichiers du projet dans le même fichier de sortie. Les types de fichiers suivants sont actuellement pris en charge:

  • Zip *: français

  • le goudron

  • tar.gz (ou tgz)

  • tar.bz2 (ou tbz2)

  • tar.snappy

  • tar.xz (ou txz)

  • pot

  • pour vous

  • guerre

3.1 Utilisation de base

Introduisez le plug-in dans POM.xml, spécifiez le fichier de configuration au format d'empaquetage assembly.xml(le nom peut être personnalisé) et spécifiez la classe d'entrée principale du travail:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptors>
                    <descriptor>src/main/resources/assembly.xml</descriptor>
                </descriptors>
                <archive>
                    <manifest>
                        <mainClass>com.heibaiying.wordcount.ClusterWordCountApp</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

Le contenu du fichier assembly.xml est le suivant:

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 
                              http://maven.apache.org/xsd/assembly-2.0.0.xsd">
    
    <id>jar-with-dependencies</id>
    <!--指明打包方式-->
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>true</useProjectArtifact>
            <unpack>true</unpack>
            <scope>runtime</scope>
            <!--这里以排除 storm 环境中已经提供的 storm-core 为例,演示排除 Jar 包-->
            <excludes>
                <exclude>org.apache.storm:storm-core</exclude>
            </excludes>
        </dependencySet>
    </dependencySets>
</assembly>

3.2 Commandes d'emballage

Les commandes pour l'empaquetage à l'aide de maven-assembly-plugin sont les suivantes:

# mvn assembly:assembly 

Génération simultanée de deux packages JAR après l'emballage, où le suffixe jar-with-dependenciesdépend du package JAR contenant un tiers, le suffixe est assembly.xmldans <id>l'étiquette spécifiée peut être des modifications personnalisées.

 

Quatre, plug-in maven-ombre-plugin

maven-shade-pluginQue les maven-assembly-pluginfonctionnalités les plus puissantes, telles que votre projet dépend de la plupart des packages JAR, dépendent JAR JAR dépendra d'autres packages, de sorte que, lorsque le projet dépend d'une version différente de JAR, et le JAR avec le même nom En ce qui concerne les fichiers de ressources, le plug-in ombre essaiera de regrouper tous les fichiers de ressources au lieu d'effectuer l'opération d'écrasement comme l'assemblage.

Habituellement maven-shade-plugincapable de répondre à la plupart des exigences d'emballage, sa configuration est simple et l'applicabilité du plus largement utilisé, il est recommandé d'utiliser ce mode de priorité.

4.1 Configuration de base

En utilisant maven-shade-pluginpackagé, quand un exemple de configuration comme suit:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <configuration>
        <createDependencyReducedPom>true</createDependencyReducedPom>
        <filters>
            <filter>
                <artifact>*:*</artifact>
                <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.sf</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.dsa</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                    <exclude>META-INF/*.rsa</exclude>
                    <exclude>META-INF/*.EC</exclude>
                    <exclude>META-INF/*.ec</exclude>
                    <exclude>META-INF/MSFTSIG.SF</exclude>
                    <exclude>META-INF/MSFTSIG.RSA</exclude>
                </excludes>
            </filter>
        </filters>
        <artifactSet>
            <excludes>
                <exclude>org.apache.storm:storm-core</exclude>
            </excludes>
        </artifactSet>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer
                       implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    <transformer
                       implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

La configuration ci-dessus provient de Storm Github. Dans la configuration ci-dessus, certains fichiers sont exclus. En effet, lorsque certains packages JAR sont générés, jarsigner sera utilisé pour générer des signatures de fichiers (vérification de l'exhaustivité), qui sont divisées en deux fichiers et stockées dans META-INF Sous le contenu:

  • un fichier de signature, avec une extension .SF ;

  • un fichier de bloc de signature, avec une extension .DSA, .RSA ou .EC。

S'il y a des références répétées à certains packages, ce qui peut entraîner le pack lorsqu'il est Invalid signature file digest for Manifest main attributesanormal, excluez donc ces fichiers dans la configuration.

4.2 Commandes d'emballage

Lors de l'utilisation de maven-shade-plugin pour l'empaquetage, les commandes d'empaquetage sont les mêmes que l'empaquetage ordinaire:

# mvn package

Après l'empaquetage, deux packages JAR seront générés. Lors de la soumission au cluster de serveurs, utilisez des JAR commençant par des fichiers non originaux.

4.3 Comment j'emballe habituellement

<!--编译打包插件-->
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin </artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>需要填写和自己建的全类名一致</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Cinq, autres exigences d'emballage

1. Utilisez Jar dans un référentiel non Maven

Habituellement, les deux packages ci-dessus peuvent satisfaire la plupart des scénarios d'utilisation. Mais si vous voulez que certains ne parviennent pas à pénétrer dans le package JAR Maven JAR jusqu'à la version finale, comme vous dans un resources/libautre référentiel non Maven introduit dans le JAR, vous pouvez l'utiliser maven-jar-pluginet le maven-dependency-pluginbrancher dans le JAR final.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                          <!--指定 resources/lib 目录-->
                        <classpathPrefix>lib/</classpathPrefix>
                          <!--应用的主入口类-->
                        <mainClass>com.heibaiying.BigDataApp</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>compile</phase>
                    <goals>
                         <!--将 resources/lib 目录所有 Jar 包打进最终的依赖中-->
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                         <!--将 resources/lib 目录所有 Jar 包一并拷贝到输出目录的 lib 目录下-->
                        <outputDirectory>
                            ${project.build.directory}/lib
                        </outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2. Excluez les fichiers Jars qui existent déjà dans le cluster

Généralement, afin d'éviter les conflits, les documents officiels vous suggéreront d'exclure les packages JAR déjà fournis dans le cluster, comme suit:

Chapitre sur la soumission des demandes de document officiel Spark:

Lors de la création de fichiers jars d'assemblage, répertoriez Spark et Hadoop en tant que provideddépendances; ceux-ci n'ont pas besoin d'être regroupés car ils sont fournis par le gestionnaire de cluster au moment de l'exécution.

Document officiel de Strom Chapitre sur l'exécution de topologies sur un cluster de production:

Exécutez ensuite mvn assembly: assembly pour obtenir un fichier jar correctement emballé. Assurez-vous d'exclure les jars Storm car le cluster a déjà Storm sur le chemin de classe.

Selon la description ci-dessus, il existe deux manières principales d'exclure des packages JAR:

  • La nécessité d'exclure la dépendance ajoute des <scope>provided</scope>balises, à quel point le package JAR sera exclu, mais il n'est pas recommandé de l'utiliser de cette manière, car alors vous ne pouvez pas utiliser le package JAR exécuté localement;

  • Dans la proposition directement maven-assembly-pluginou en maven-shade-pluginutilisant un fichier de configuration <exclude>exclu.

3. Empaquetez le fichier Scala

Si vous utilisez le langage de programmation Scala, cette fois nécessite une attention particulière: Par défaut, Maven ne mettra pas scalale fichier dans le JAR final, la nécessité d'ajouter des maven-scala-pluginplug-ins supplémentaires , la configuration commune est la suivante:

<plugin>
    <groupId>org.scala-tools</groupId>
    <artifactId>maven-scala-plugin</artifactId>
    <version>2.15.1</version>
    <executions>
        <execution>
            <id>scala-compile</id>
            <goals>
                <goal>compile</goal>
            </goals>
            <configuration>
                <includes>
                    <include>**/*.scala</include>
                </includes>
            </configuration>
        </execution>
        <execution>
            <id>scala-test-compile</id>
            <goals>
                <goal>testCompile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Référence

Pour la configuration détaillée de chaque plug-in de Maven, vous pouvez consulter ses documents officiels:

Pour plus de configuration de maven-shadow-plugin, veuillez consulter ce blog: guide de démarrage de maven-shad

Je suppose que tu aimes

Origine blog.csdn.net/godlovedaniel/article/details/108884731
conseillé
Classement