7
votes

gérer le conflit sur Java ClassPath

J'exposer mon contexte:

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:

Programa.ksh et programb.ksh

Les deux ont besoin de C.jar mais dans différentes versions (mais avec exactement le même paquet et les mêmes classes):

  • Programme un besoin C-1.0.jar
  • Programme B Beaout C-2.0.jar

    Je précise que les deux programmes partagent le même Weblogic ClassPath.

    Donc, mon path contient dans cet ordre:

    .....

    C-1.0.jar

    C-2.0.jar

    .....

    Comment puis-je faire pour que chaque programme trouve sa bonne bibliothèque?

    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.


6 commentaires

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 (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.


4 Réponses :


1
votes

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


1 commentaires

Si c'est Java 6 ou plus tard, il peut également utiliser Java -CP / Chemin / To / A / Lib / * My.Main



5
votes

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.

Vous pouvez soit exécuter les deux processus sur différents téléviseurs VMS, soit aller dans beaucoup d'enfer de classe ...


0 commentaires

5
votes

Si vous lancez deux instances distinctes de la JVM pour les deux programmes, alors n'utilisez pas le même point de classe! n'est-ce pas évident?

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.

Ancienne réponse: En supposant que vous parlez de threads plutôt que de processus:

La meilleure solution serait de fixer A, B ou C afin que A et B puissent utiliser la même version de c.

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.

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.


1 commentaires

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é.



0
votes

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.


2 commentaires

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.