2015-04-27 3 views
0

У меня есть webapp, который я развертываю в Tomcat с двумя модулями со своими зависимостями. Я столкнулся с проблемой, когда зависимость одной из библиотек в модуле A намного старше, чем то, что требуется другой библиотекой в ​​модуле B. Например, здесь указаны зависимости в файле pom:Развертывание многомодульного приложения Tomcat с несколькими версиями зависимостей

Модуль A:

<dependencies> 
    <dependency> 
     <groupId>org.example.com</groupId> 
     <artifactId>libraryA</artifactId> 
     <version>1.0</version> 
    </dependency> 
</dependencies> 

Модуль B:

<dependencies> 
    <dependency> 
     <groupId>org.another.com</groupId> 
     <artifactId>libraryB</artifactId> 
     <version>1.0</version> 
    </dependency> 
</dependencies> 

libraryA затем зависит от libraryC версии 1.0, а зависит от библиотека B libraryC версии 2.0. libraryA не будет работать с новой версией libraryC, а libraryB не будет работать с более старой версией libraryC. Какие у меня есть (если есть) варианты наличия этих модулей в одном и том же Tomcat webapp, используя разные версии этих зависимостей?

ответ

1

добро пожаловать в банку ад. первый, два потенциальные блицкриг:

  • может быть, вы можете выбрать какой-то промежуточный вариант libraryC
  • может быть, вы можете перенести libraryA и в новейшую библиотеку B версии libraryC. если это с открытым исходным кодом, просто сделайте запрос на вытягивание

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

  • раскол приложения. архитектура микросервисов часто помогает здесь, но требуется много инфраструктуры (мониторинг, развертывание, конфигурация и т. д.)
  • OSGI. я никогда не использовал его, поэтому я не знаю, как и как вы можете интегрировать его с tomcat, но osgi - это платформа для лучшего управления зависимостями (включая управление версиями).
  • переупаковка. есть инструменты, чтобы взять существующий источник (не уверен, что относительно скомпилированных классов) библиотеки x.y.z и создать зеркальную библиотеку a.b.c. после этого момента у них есть разные имена, чтобы они могли легко сосуществовать. он не будет работать для каждой библиотеки, поскольку некоторые из них ссылаются на себя, используя отражение
  • различные загрузчики классов. вы можете попробовать загрузить почти все в своем приложении с одним загрузчиком классов, libC v1 со вторым и libC v2 с третьим. но это может потребовать некоторой настройки, возможно даже пользовательских загрузчиков классов. также позже вы можете столкнуться с проблемами совместимости, так как класс A от classloader 1 не является экземпляром класса A от загрузчика классов 2.
+0

Спасибо. Похоже, я занят какой-то болезненной работой. – Dave

Смежные вопросы