2008-12-16 5 views

Répondre

29

Classpath hell est une conséquence malheureuse de la liaison dynamique du type effectué par Java.

Votre programme n'est pas une entité fixe, mais plutôt l'ensemble exact des classes chargées par une machine virtuelle Java dans un cas particulier.

Il est très possible d'être dans des situations où la même ligne de commande sur différentes plates-formes ou même sur le même entraînerait des résultats complètement différents en raison des règles de résolution.

Il pourrait y avoir des différences dans les bibliothèques standard (très commun). Les bibliothèques peuvent être masquées les unes par les autres (une version plus ancienne peut même être utilisée à la place d'une version plus récente). La structure du répertoire pourrait désordre la résolution. Une version différente de la même classe peut apparaître dans plusieurs bibliothèques et la première rencontrée sera utilisée, etc. Puisque Java, par spécification, utilise une première politique rencontrée, des dépendances d'ordre inconnues peuvent conduire à des problèmes. Bien sûr, puisque c'est la ligne de commande et qu'elle fait partie de la spécification, il n'y a pas de véritables avertissements.

C'est toujours un problème. Par exemple, sur Mac OS, l'horrible support d'Apple signifie que votre machine se retrouve avec plusieurs JVM et plusieurs JRE, et vous ne pouvez jamais facilement copier des choses d'un endroit à l'autre. Si vous avez plusieurs bibliothèques qui ont été compilés avec des versions spécifiques, mais différentes des autres bibliothèques, vous coulld des problèmes, etc.

Cependant, ce problème n'est pas inhérent à Java. Je me souviens de ma part de situations d'enfer de DLL tout en programmant des fenêtres dans les années 90. Toute situation où vous devez compter sur quelque chose dans le système de fichiers pour assembler votre programme plutôt que d'avoir un seul exécutable bien défini est un problème.

Cependant, les avantages de ce modèle sont encore grands, donc je suis prêt à tolérer cet enfer. Il y a aussi des pas dans la bonne direction du côté de Sun. Par exemple, Java6 vous permet de spécifier simplement un répertoire avec des jars plutôt que d'avoir à les énumérer.

BTW: sont aussi chemins de classe problème si vous utilisez un environnement qui utilise un chargeur de classe par défaut. Par exemple, j'ai eu beaucoup de problèmes à exécuter des choses comme Hibernate ou Digester sous Eclipse parce que les classloaders étaient incompatibles.

2

Je pense que « l'enfer classpath » fait référence au moment où le classpath d'une application Java ne peut être réglé en utilisant la variable d'environnement CLASSPATH. Cela a conduit à de nombreuses applications nécessitant des modifications de la configuration globale du système (différentes pour chaque système d'exploitation), des conflits de versions entre les applications et une confusion générale.

3

Classpath/pot-enfer a deux trappes d'évacuation si elles ont un sens pour votre projet:

2

Ceci est un exemple un peu plus concret:

Lorsque deux bibliothèques (ou une bibliothèque et l'application) nécessitent différentes versions du même troisième bibliothèque . Si les deux versions de la troisième bibliothèque utilisent les mêmes noms de classe , il est impossible de charger les deux versions de la troisième bibliothèque avec le même classloader.

Prenez un butin à http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell pour plus d'exemples.

Questions connexes