Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
I componenti installati nei cluster HDInsight hanno dipendenze da librerie di terze parti. In genere, una versione specifica di moduli comuni come Guava fa riferimento a questi componenti predefiniti. Quando si invia un'applicazione con le relative dipendenze, può causare un conflitto tra versioni diverse dello stesso modulo. Se la versione del componente a cui si fa riferimento prima nel classpath, i componenti predefiniti potrebbero generare eccezioni a causa dell'incompatibilità della versione. Tuttavia, se i componenti predefiniti inseriscono prima le relative dipendenze nel classpath, l'applicazione potrebbe generare errori come NoSuchMethod
.
Per evitare conflitti di versione, prendere in considerazione l'ombreggiatura delle dipendenze dell'applicazione.
Cosa significa l'ombreggiatura del pacchetto?
L'ombreggiatura consente di includere e rinominare le dipendenze. Riloca le classi e riscrive il bytecode e le risorse interessate per creare una copia privata delle dipendenze.
Come ombreggiatura di un pacchetto?
Usare uber-jar
Uber-jar è un singolo file JAR che contiene sia il file JAR dell'applicazione che le relative dipendenze. Le dipendenze in Uber-jar non sono ombreggiate per impostazione predefinita. In alcuni casi, questo può introdurre conflitti di versione se altri componenti o applicazioni fanno riferimento a una versione diversa di tali librerie. Per evitare questo problema, è possibile compilare un file Uber-Jar con alcune o tutte le dipendenze ombreggiate.
Pacchetto shade con Maven
Maven può compilare applicazioni scritte sia in Java che in Scala. Maven-shade-plugin consente di creare facilmente un file uber-jar ombreggiato.
L'esempio seguente mostra un file pom.xml
che è stato aggiornato per ombreggiaturare un pacchetto usando maven-shade-plugin. La sezione <relocation>…</relocation>
XML sposta le classi dal pacchetto com.google.guava
al pacchetto com.google.shaded.guava
spostando le voci del file JAR corrispondenti e riscrivendo il bytecode interessato.
Dopo aver modificato pom.xml
, è possibile eseguire mvn package
per compilare il file uber-jar ombreggiato.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>com.google.guava</pattern>
<shadedPattern>com.google.shaded.guava</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Pacchetto shade con SBT
SBT è anche uno strumento di compilazione per Scala e Java. SBT non ha un plug-in shade come maven-shade-plugin. È possibile modificare build.sbt
il file in pacchetti ombreggiati.
Ad esempio, per ombreggiaturare com.google.guava
, è possibile aggiungere il comando seguente al build.sbt
file :
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("com.google.guava" -> "com.google.shaded.guava.@1").inAll
)
È quindi possibile eseguire sbt clean
e sbt assembly
per compilare il file jar ombreggiato.