2012-05-13 3 views
1

У нас есть инфраструктура, которая работает внутри 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 конфликтуют между классами приложений и путями классов пакетов, когда они полностью отключены? Как решить эту проблему?

ответ

1

Итак, если я правильно понимаю, вы запускаете встроенную инфраструктуру OSGi из webapp Tomcat, а классы из пути Tomcat-класса теперь видны во встроенной среде OSGi.

Я предполагаю, что это зависит от того, какие классы вы предоставляете рамке. Для Felix (я не знаю, какую реализацию OSGi вы используете) вы можете настроить ее, используя framework configuration properties.

Может быть, ваша проблема связана с this и ваше приложение устанавливает: org.osgi.framework.bootdelegation=*

+1

Решение, которое мы нашли после того, как много различных испытаний был своего рода странным и опровержением концепции класса изоляции в OSGi. Сначала классы ActiveMQ загружались в путь класса приложения. Когда пакет OSGi пытался загрузить один и тот же набор классов, он загружался хорошо, но интерфейсы считались доступными из класса! –

+0

Способ решения проблемы заключается в загрузке выведенных из ActiveMQ соединителей (и, следовательно, классов) при запуске Bundle (в активаторе) и предоставлении тем же классам для загрузки в класс приложений classpath позже. Таким образом, пакет получил свой собственный набор классов activemq. Ни один из классов activemq не подвергался воздействию фрагментов. Это только показывает некоторые из лазеек OSGi, которые в некоторых случаях не гарантируют классовую изоляцию! –

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