У нас есть инфраструктура, которая работает внутри OSGi. В одном из наших пакетов используется ActiveMQ для уведомлений JMS pub/sub. Этот пакет вкладывается ActiveMQ банку внутри пучка (в частном порядке)ClassCastException в OSGi, встроенном в Tomcat
Bundle-ClassPath: ., .... lib/activemq-all.jar, ....
Все это прекрасно работает во всех сценариях (за исключением одного случая - вложения случая).
Вложение: Теперь мы имеем дело со сценариями, в которых приложение внедряет наши рамки. Это также отлично работает, пока одно из приложений внедрения не начнет использовать activemq из своего пути к классам. Это приложение для встраивания - это веб-приложение, основанное на tomcat, и имеющее activemq-all.jar в libc tomcat.
Мы НЕ экспортируем что-либо, связанное с active-mq через наши фрагментные пакеты, поэтому не должно быть видимости классов activemq в classpath пути tomcat для наших пакетов, но, похоже, это происходит.
Caused by: java.lang.ClassCastException: org.apache.activemq.transport.tcp.TcpTransportFactory cannot be cast to org.apache.activemq.transport.TransportFactory at org.apache.activemq.transport.TransportFactory.findTransportFactory(TransportFactory.java:201) ... 24 more
Мы пытались установки/сброса ContextClassLoader до/после создания ActiveMQ соединений, которые, казалось бы решить эту проблему, но преодолев много других вещей (около Apache Tuscany SDO, который мы используем), так что не является жизнеспособным вариантом.
Вопрос: Почему классы ActiveMQ конфликтуют между классами приложений и путями классов пакетов, когда они полностью отключены? Как решить эту проблему?
Решение, которое мы нашли после того, как много различных испытаний был своего рода странным и опровержением концепции класса изоляции в OSGi. Сначала классы ActiveMQ загружались в путь класса приложения. Когда пакет OSGi пытался загрузить один и тот же набор классов, он загружался хорошо, но интерфейсы считались доступными из класса! –
Способ решения проблемы заключается в загрузке выведенных из ActiveMQ соединителей (и, следовательно, классов) при запуске Bundle (в активаторе) и предоставлении тем же классам для загрузки в класс приложений classpath позже. Таким образом, пакет получил свой собственный набор классов activemq. Ни один из классов activemq не подвергался воздействию фрагментов. Это только показывает некоторые из лазеек OSGi, которые в некоторых случаях не гарантируют классовую изоляцию! –