Condividi tramite


Gestire in modo sicuro le dipendenze JAR

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.

Passaggi successivi