Qu'est-ce que classpath hell et/était-ce vraiment un problème pour Java?Qu'est-ce que classpath hell et est-ce que c'était vraiment un problème pour Java?
Répondre
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.
Il y a beaucoup de bonnes choses ici http://mindprod.com/jgloss/classpath.html et http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html
Je n'ai eu des problèmes avec classpaths quand je ne suis pas moi-même la mise en est d'utiliser -cp. Essayer de comprendre comment vos logiciels tiers définissent leurs chemins de classe peut parfois être pénible.
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.
Classpath/pot-enfer a deux trappes d'évacuation si elles ont un sens pour votre projet:
- OSGi
- JarJarLinks
- NetBeans Module System - Je ne sais pas si cela est exploitable en dehors de NetBeans
- D'autres?
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.
- 1. Problème Java Classpath
- 2. Java Manifest.mf classpath issues
- 3. Junit et Java classpath woes - OS X
- 4. Problème avec le classpath dans le projet Java
- 5. ClassNotFoundException avec la tâche java de ant et classpath
- 6. Java LoadLibrary UnsatisfiedLinkError, bien que Java puisse voir le fichier et tourne sur un autre ordinateur
- 7. Est-ce que Float est vraiment absent de HtmlTextWriterStyle?
- 8. Est-ce que mysqldump --password fait vraiment ce qu'il dit?
- 9. Est-ce que l'héritage cache vraiment les méthodes?
- 10. Est-ce que GRASP Creator se découpe vraiment?
- 11. WCF RequestChannel; Que se passe-t-il vraiment?
- 12. Classpath pour Solr Transformer personnalisé
- 13. Est-ce que addSubview de UIView conserve vraiment la vue?
- 14. Est-ce que ces fonctions sont vraiment différentes? jQuery.extend()
- 15. Comment utiliser Java ClassLoader pour charger un fichier à partir du classpath?
- 16. Windows 7 OpenLDAP Curl DLL Dépendance Hell
- 17. Est-ce que Sphinx et thinking_sphinx sont vraiment stables? Non indexation Colonnes
- 18. Est-ce que Java passe par référence?
- 19. Est-ce que l'ordre des liens pour supC++ est vraiment important?
- 20. Aide pour un comportement GC GC vraiment bizarre
- 21. .NET en tant que client, Java en tant que serveur
- 22. Je ne comprends pas vraiment ce que les paramètres pour la construction de tcp :: resolver :: query
- 23. Comment puis-je vraiment faire en sorte que Subversion ignore un répertoire?
- 24. Est-ce que java peut appeler un script pour redémarrer java dans solaris?
- 25. Java: Est-ce que SelectionKey.attach() est cassé?
- 26. Que pourrait apprendre C# de Java?
- 27. Que puis-je utiliser pour connecter Java à Video4Linux?
- 28. vérifier que le compilateur produit le code Java 1.5
- 29. Que * est * un IPM.DistList?
- 30. Que sont DailyTrigger et ScheduledTasks?
Je pense que c'est http://en.wikipedia.org/wiki/Classloader#JAR_hell –