2010-01-06 5 views
1

Mon application utilise le fichier jar Http client2.0.2 et ma combinaison de test d'unité utilise le fichier jar Http client3.1.Configurer deux versions du même pot dans une seule application

Comment configurer deux versions du même fichier jar dans une seule application?

+2

Pourquoi tes tests unitaires contre une bibliothèque différente? Le but des tests unitaires est de tester le comportement des composants individuels de votre application. Si vos tests unitaires ne reproduisent pas fidèlement l'environnement dans lequel l'application sera utilisée, à quoi cela sert-il? –

+0

J'utilise l'open source pour les tests unitaires, cette version open source utilisée en interne du client http (3.1). Mais j'ai utilisé l'ancienne version du fichier jar dans Application. – Tony

Répondre

2

Peut-être que vous pourriez utiliser jarjar pour intégrer Http client 2.0.2 dans votre application et laissez vos tests unitaires utiliser la version la plus récente.

3

Vous devez configurer deux chemins de classe différents. Pour les tests (que vous exécutez probablement avec un outil comme ant), ajoutez le client http 3.1 au classpath. Lorsque vous déployez, déployez le client http 2.0.2 sur le serveur de l'application.

Omettez les classes de test et l'autre version du client http. Il existe cependant un inconvénient: Vous ne pouvez pas tester les classes qui utilisent l'ancien client http (enfin, pas localement). Par conséquent, je suggère de mettre à niveau l'application à la nouvelle version de la bibliothèque.

+0

+1: solution propre ... c'est comme ça que netbeans gère ce problème ... –

1

I vraiment ne crois pas que vous devriez tester contre un pot, et le déploiement contre un autre. Je pense que c'est le vrai problème ici.

+0

J'utilise l'open source pour les tests unitaires, cette dernière version open source utilisée en interne le client http (3.1). Mais j'ai utilisé l'ancienne version du fichier jar dans Application. – Tony

1

Vous pouvez avoir différentes versions de la même classe (ou bibliothèque) dans votre application. Ce n'est pas un gros problème, vous devez seulement utiliser des chargeurs de classes différents pour vos bibliothèques.

Vous devrez créer un URLClassLoader pour charger votre application de test open source (le classloader parent sera le chargeur de classe système), peut-être un autre chargeur de classe pour la version 3.1 du client en tant qu'enfant du premier. Ensuite, supprimez ces bibliothèques du chemin de la classe et résolvez et 'démarrez' la classe 'main' de votre application open source. Il devrait soit fonctionner directement ou au moins donner assez d'indices (NoClassDefFoundError) pour les étapes manquantes (ne l'ai pas essayé avant, désolé, c'est plutôt théorique). Jetez un oeil à la JavaDoc pour la classe java.lang.Classloader (et ses extensions)

S'il y avait une exigence d'utiliser différentes versions de la même bibliothèque dans une seule application, j'utiliserais OSGi comme cadre, parce que là vous obtenez cette fonctionnalité gratuitement. Le bundle client peut dépendre de la version du client 2.0.2, le bundle de test sur la version client 3.1. Vous n'avez qu'à modifier les fichiers Manifest et démarrer l'application avec un framework OSGi (comme Equinox).

1

Netbeans faire très bien: vous avez 2 dossiers séparés pour les libraies importés, l'un pour le test (Test Bibliothèques) et l'autre pour votre application (Librairies) ...

Si votre IDE ne pas Soutenez cela, vous pouvez le faire manuellement comme suggéré par Aaron Digulla et définir différents chemins de classe dans votre config ant ... vous pouvez suivre ce tutorial pour le faire ...

Questions connexes