Java Language Exécution d'une application Java avec des dépendances de bibliothèque


Exemple

Ceci est une continuation des exemples "main class" et "executable JAR" .

Les applications Java classiques consistent en un code spécifique à l'application et en divers codes de bibliothèque réutilisables que vous avez implémentés ou mis en œuvre par des tiers. Ces derniers sont généralement appelés dépendances de bibliothèque et sont généralement regroupés sous forme de fichiers JAR.

Java est un langage lié dynamiquement. Lorsque vous exécutez une application Java avec des dépendances de bibliothèque, la machine virtuelle Java doit savoir où se trouvent les dépendances pour pouvoir charger les classes selon vos besoins. D'une manière générale, il y a deux manières de traiter cela:

  • L'application et ses dépendances peuvent être regroupées en un seul fichier JAR contenant toutes les classes et ressources requises.

  • On peut dire à la JVM où trouver les fichiers JAR dépendants via le classpath d’exécution.

Pour un fichier JAR exécutable, le chemin de classe d'exécution est spécifié par l'attribut de manifeste "Class-Path". (Note éditoriale: ceci doit être décrit dans une rubrique distincte sur la commande jar .) Sinon, le classpath d’exécution doit être fourni à l’aide de l’option -cp ou de la CLASSPATH environnement CLASSPATH .

Par exemple, supposons que nous ayons une application Java dans le fichier "myApp.jar" dont la classe de point d’entrée est com.example.MyApp . Supposons également que l'application dépend des fichiers JAR de la bibliothèque "lib / library1.jar" et "lib / library2.jar". Nous pourrions lancer l'application en utilisant la commande java comme suit dans une ligne de commande:

$ # Alternative 1 (preferred)
$ java -cp myApp.jar:lib/library1.jar:lib/library2.jar com.example.MyApp

$ # Alternative 2
$ export CLASSPATH=myApp.jar:lib/library1.jar:lib/library2.jar
$ java com.example.MyApp

(Sous Windows, vous utiliseriez ; au lieu de : tant que séparateur de chemin de classe, et vous CLASSPATH variable CLASSPATH (locale) à l'aide de set plutôt que d' export .)

Bien qu'un développeur Java soit à l'aise avec cela, il n'est pas "convivial". Il est donc courant d'écrire un script shell simple (ou un fichier de commandes Windows) pour masquer les détails que l'utilisateur n'a pas besoin de connaître. Par exemple, si vous placez le script shell suivant dans un fichier appelé "myApp", exécutez-le et placez-le dans un répertoire du chemin de recherche:

#!/bin/bash
# The 'myApp' wrapper script

export DIR=/usr/libexec/myApp
export CLASSPATH=$DIR/myApp.jar:$DIR/lib/library1.jar:$DIR/lib/library2.jar
java com.example.MyApp

alors vous pourriez l'exécuter comme suit:

$ myApp arg1 arg2 ...

Tous les arguments sur la ligne de commande seront transmis à l'application Java via l'extension "$@" . (Vous pouvez faire quelque chose de similaire avec un fichier de commandes Windows, bien que la syntaxe soit différente.)