table des matières
Trois, plug-in maven-assembly-plugin
Quatre, plug-in maven-ombre-plugin
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
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 package
pour 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 package
combat 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 --jars
dé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 One
packaging 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-plugin
ou des maven-shade-plugin
plug-ins.
Trois, plug-in maven-assembly-plugin
Assembly
Le 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-dependencies
dépend du package JAR contenant un tiers, le suffixe est assembly.xml
dans <id>
l'étiquette spécifiée peut être des modifications personnalisées.
Quatre, plug-in maven-ombre-plugin
maven-shade-plugin
Que les maven-assembly-plugin
fonctionnalité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-plugin
capable 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-plugin
packagé, 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 attributes
anormal, 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/lib
autre référentiel non Maven introduit dans le JAR, vous pouvez l'utiliser maven-jar-plugin
et le maven-dependency-plugin
brancher 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
provided
dé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-plugin
ou enmaven-shade-plugin
utilisant 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 scala
le fichier dans le JAR final, la nécessité d'ajouter des maven-scala-plugin
plug-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:
-
maven-assembly-plugin: http://maven.apache.org/plugins/maven-assembly-plugin/
-
plugin-ombre-maven: http://maven.apache.org/plugins/maven-shade-plugin/
-
maven-jar-plugin: http://maven.apache.org/plugins/maven-jar-plugin/
-
maven-dependency-plugin: http://maven.apache.org/components/plugins/maven-dependency-plugin/
Pour plus de configuration de maven-shadow-plugin, veuillez consulter ce blog: guide de démarrage de maven-shad