J'exposer mon contexte: p>
J'ai deux programmes Java qui fonctionnent sur un serveur Web Anlogic unique: programme A et programme B. Ceux-ci sont lancés par deux ksh: p>
Programa.ksh et programb.ksh P>
Les deux ont besoin de C.jar mais dans différentes versions (mais avec exactement le même paquet et les mêmes classes): p>
Je précise que les deux programmes partagent le même Weblogic ClassPath. P>
Donc, mon path contient dans cet ordre: p>
..... p>
C-1.0.jar P>
C-2.0.jar P>
..... p>
Comment puis-je faire pour que chaque programme trouve sa bonne bibliothèque? p>
Par exemple, avec ma configuration réelle, le programme B utilisera toujours C-1.0.jar au lieu de C-2.0.jar en raison de la position prioritaire sur ClassPath. P>
4 Réponses :
Vous devrez vous assurer qu'une seule bibliothèque est présente sur CLASSPATH.
Le moyen le plus simple est de créer 2 répertoires libérations avec des dépendances correctes et de référencer tous les pots de là dans votre script de démarrage. P>
Ce script de shell simple le fera automatiquement pour vous: P>
MY_CLASSPATH=. for i in /path/to/A/lib/*.jar do MY_CLASSPATH=$MY_CLASSPATH:$i done java -cp $MY_CLASSPATH my.main
Si c'est Java 6 ou plus tard, il peut également utiliser Java -CP / Chemin / To / A / Lib / * My.Main
Fondamentalement, vous ne pouvez pas faire cela (simplement). Jetez un coup d'œil à http://fr.wikipedia.org/wiki/java_classloader#jar_hell , où ils expliquent que le chargeur de classe Java standard ne peut pas faire cela. P>
Vous pouvez soit exécuter les deux processus sur différents téléviseurs VMS, soit aller dans beaucoup d'enfer de classe ... p>
Si vous lancez deux instances distinctes de la JVM pour les deux programmes, Utilisez-vous peut-être la variable d'environnement de classe de classe? C'est une très vieille pratique obsolète et vous ne devriez pas le faire. Utilisez le paramètre de ligne de commande -ClassPath, de cette façon, vous pouvez facilement utiliser différents espaces de classe pour les deux programmes. P>
La meilleure solution serait de fixer A, B ou C afin que A et B puissent utiliser la même version de c. P>
ou, si les deux versions de C ont effectivement un comportement intentionnellement différent, utilisez un emballage ou des noms de classe différents pour eux. P>
Seulement si vous ne pouvez pas modifier A, B ou C, si vous envisagez la solution technique d'écrire une enveloppe qui utilise Différents chargeurs de classes pour A et B afin qu'ils verront différentes versions de c. P>
Je suis d'accord avec votre réponse :) J'ai remarqué que je n'étais pas clair dans ma question, je l'avais donc réédité.
Je supposerais que ce sont des applications Web Java si elles fonctionnent sur Weblogic, elles devraient être dans des fichiers de guerre. Il n'y aura pas de collision si chacun met ses versions de jar respectives dans le Web-Inf / Lib de leur fichier de guerre. P>
Il n'y a pas de webApps Java, ce ne sont que deux lots purement en J2SE. Weblogic soutient simplement un cadre de persistance spécifique appelé Jrisk (hébété)
Est-ce qu'ils déploient sur un serveur WebLogic? Ou utilisez simplement des pots? (Voulez-vous dire "propriétaire"?) Dans ce cas, vous définissez la classe de classe en utilisant l'option -ClassPath dans le script qui exécute le travail.
Il y a quelque chose qui ne va pas avec votre terminologie. Les processus ne "fonctionnent pas sur le JVM" Le JVM est un processus i> (unique). Parlez-vous de threads?
Oui, vous avez raison, en fait, il s'agit de deux lanceurs Java enveloppés dans le script Shell. J'ai réédité le poteau avec la correction
Votre question n'est toujours pas vraiment claire. Si vous lancez Java deux fois (un pour A et un pour B), A et B ne fonctionnent pas sur le même VM. Chaque programme a son propre VM. Est-ce ce que tu fais?
Je viens de corriger ma question
Il n'est toujours pas clair. Avez-vous un serveur WebLogic en cours d'exécution ou deux? Quel type de programmes sont A et B? Des applications Web déployées en tant que fichiers de guerre? Oreilles? Les pots d'une application d'entreprise ne doivent pas être dans la classe de classe du serveur. Ils devraient être dans la guerre ou l'oreille de l'application. Les serveurs d'applications sont en mesure de déployer deux applications en utilisant des pots en conflit si ces pots sont déployés dans le cadre de l'application.
En fait, il y a deux ksh qui lancent un programme Java. Mais les deux partagent le même plan de classe Weblogic.