управлять конфликтом на пути к классам Java - PullRequest
7 голосов
/ 18 ноября 2011

Я раскрываю свой контекст:

У меня есть две Java-программы, которые работают на уникальном сервере Weblogic: программа A и программа B. Эти программы запускаются двумя ksh:

programA.kshи programB.ksh

Оба требуют C.jar, но в разных версиях (но с одинаковым пакетом и классами):

  • программе A требуется C-1.0.jar
  • программе B нужен C-2.0.jar

Я уточнил, что обе программы используют один и тот же веб-логический путь к классам.

Итак, мой путь к классам содержится в таком порядке:

.....

C-1.0.jar

C-2.0.jar

.....

Как я могу это сделатьчтобы каждая программа нашла свою хорошую библиотеку?

Например, при моей реальной конфигурации программа B всегда будет использовать C-1.0.jar вместо C-2.0.jar из-за позиции приоритета в classpath.

Ответы [ 4 ]

5 голосов
/ 18 ноября 2011

В принципе, вы не можете сделать это (просто).Взгляните на http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell,, где объясняется, что стандартный загрузчик классов Java не может этого сделать.

Вы можете либо запустить два процесса на разных виртуальных машинах, либо попасть в адский загрузчик классов ...

5 голосов
/ 18 ноября 2011

Если вы запускаете два отдельных экземпляра JVM для двух программ, , тогда не используйте один и тот же путь к классам! Разве это не очевидно?

Возможно, вы используете CLASSPATHпеременная окружения?Это очень старая, устаревшая практика, и вы не должны этого делать.используйте параметр командной строки -classpath, чтобы вы могли легко использовать разные пути к классам для двух программ.

Старый ответ: Предполагая, что вы говорите о потоках, а не о процессах:

Лучшим решением было бы исправить A, B или C, чтобы и A, и B могли использовать одну и ту же версию C.

Или, если две версии C на самом деле ведут себя преднамеренно по-разному,используйте для них другой пакет или имена классов.

Только если вы не можете изменить A, B или C, вы должны рассмотреть техническое решение написания оболочки, которая использует разные загрузчики классов для A и Bчтобы они увидели разные версии C.

1 голос
/ 18 ноября 2011

Вам нужно будет убедиться, что в пути к классам присутствует только одна библиотека.

Самый простой способ - создать 2 директории lib с правильными зависимостями и ссылаться на все jar-файлы из этого сценария при запуске для соответствующего процесса.

Этот простой сценарий оболочки сделает это автоматически:

MY_CLASSPATH=.

for i in /path/to/A/lib/*.jar
do
  MY_CLASSPATH=$MY_CLASSPATH:$i
done

java -cp $MY_CLASSPATH my.main
0 голосов
/ 18 ноября 2011

Я бы предположил, что это веб-приложения Java, если они работают в WebLogic, они должны быть в файлах WAR.Не будет никакого конфликта, если каждый из них поместит свои соответствующие версии JAR в WEB-INF / lib своего WAR-файла.

...