Chargeur de classe questions - Comment faire pour déterminer la version des bibliothèques (jar-files) sont chargés
Je viens de résoudre un autre *I-though-I-was-using-this-version-of-a-library-but-apparently-my-app-server-has-already-loaded-an-older-version-of-this-library-*question (soupir).
Quelqu'un connais un bon moyen de vérifier (ou moniteur) si votre application a accès à tous les jar-files, ou chargés de classe-versions?
Merci d'avance!
[P. S. Une très bonne raison pour commencer à utiliser le OSGi module de l'architecture à mon avis!]
Mise à jour: Cette article a aidé aussi! Il m'a permis de découvrir les classes JBoss' chargeur de classes chargées par écrit dans un fichier journal.
Vous devez vous connecter pour publier un commentaire.
Si vous arrive d'être à l'aide de JBoss, il y a un MBean (le chargeur de classe référentiel iirc) où vous pouvez demander à tous les chargeurs de classes qui ont chargé une certaine classe.
Si tout le reste échoue, il y a toujours " java -verbose:classe qui permet d'imprimer l'emplacement du pot pour chaque fichier de classe qui est en cours de chargement.
Si vous avez des versions appropriées de l'info dans un bocal manifeste, il existe des méthodes pour récupérer et tester la version. Pas besoin d'manuellement lire le manifeste.
java.lang.Package.getImplementationVersion() et getSpecificationVersion() et isCompatibleWith() sonnent comme ils le ferais ce que vous cherchez.
Vous pouvez obtenir le Paquet avec cette.getClass().getPackage() entre autres.
La javadoc de java.lang.Package de ne pas spécifique manifeste noms d'attribut pour ces attributs. Une rapide recherche sur google il s'est avéré à http://java.sun.com/docs/books/tutorial/deployment/jar/packageman.html
Dans la version actuelle de Java, de la bibliothèque de la gestion des versions est plutôt laineux terme qui s'appuie sur le récipient bien emballés avec une utilité manifeste. Même alors, c'est beaucoup de travail pour l'exécution de l'application pour recueillir cette information d'une manière utile. La JVm runtime vous donne aucune aide que ce soit.
Je pense que votre meilleur pari est de faire appliquer le présent au moment de la construction, à l'aide de la dépendance des outils de gestion comme le Lierre ou Maven pour récupérer les versions correctes des tout.
Il est intéressant de noter, Java 7 sera probablement inclut un module de gestion des versions cadre précisément pour ce genre de chose. Pas que cela vous aide à vous en ce moment,
Je ne pense pas qu'il y est une bonne façon de vérifier cela. Et je ne suis pas sûr de ce que vous voulez faire. Ce que vous devez faire est de vous familiariser avec votre application-serveur de chargement de classe de l'architecture, et de comprendre comment cela fonctionne.
Une explication simplifiée de la façon dont cela fonctionne est: un EJB ou une application web va d'abord chercher une classe ou d'une ressource dans les bibliothèques déclaré dans son propre module (ejb-jar ou war). si la classe ne s'y trouve pas, le chargeur de classes transmet la demande à la son chargeur de classe parent qui est déclarée dépendance (en général un ejb) ou de l'application du chargeur de classe qui est responsable de charger les bibliothèques et les ressources déclarées dans l'oreille paquet. Si le groupe ou la ressource n'est toujours pas trouvé la demande est transmise au serveur d'application qui va regarder dans sa propre chemin de classe.
Ceci étant dit, vous devriez vous rappeler qu'un module Java EE (application web, ejb) seront toujours à la charge des classes à partir d'un pot qui est le plus proche de la portée. Par exemple, si vous créez un package de log4j v1 dans le fichier war, log4j v2 au niveau de l'oreille et de vous mettre log4j v3 dans votre application-serveur de chemin de classe de l', le module utilise le pot dans son propre module. l'enlever et il va utiliser l'un au niveau de l'oreille. prenez cette sortie et il utilise la dans l'app-serveur du classpath. Les choses deviennent plus difficile quand vous avez des dépendances complexes entre les modules.
Le mieux est de mettre l'application des bibliothèques au niveau de l'oreille.
Il doit y avoir une meilleure façon que la façon dont je le fais, mais j'ai tendance à le faire dans un très manuelle.
Comme je l'ai dit, il est manuel, mais il fonctionne.