Я занимаюсь разработкой проекта с несколькими пакетами OSGi, развернутыми в ServiceMix (сборник FuseESB, v. 4.3.1).Проблема заключается в том, что один из этих пакетов подключается к EJB в WebLogic, поэтому он встраивает weblogic.jar.
Решение работает, однако требуется хитрость.Пакет экспортирует сервис Spring через OSGi.Эта служба импортируется в другой пакет, который является точкой входа в систему.Когда из этого пакета был вызван сервис, веблогические классы были невидимы.Трюк заключается в том, чтобы обернуть сервис Spring в следующем аспекте, который временно переключает загрузчик классов:
public Object profileInventory(ProceedingJoinPoint pjp) throws Throwable {
Object output = null;
ClassLoader clOld = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(pjp.getTarget().getClass().getClassLoader());
output = pjp.proceed();
} finally {
Thread.currentThread().setContextClassLoader(clOld);
}
return output;
}
Как я понял, сервис вызывается с загрузчиком классов из входного комплекта, а не с загрузчиком классов из комплекта, который встраивает weblogic.и для этого загрузчика классов встроенные классы зависимостей не видны.В аналогичном случае экспортированный сервис Spring может использовать частный импорт и частные пакеты из своего пакета, но со встроенными jar-файлами это не так.быть видимым только тогда, когда вызов происходит от встраивания пакета (или с помощью трюка с загрузчиком классов), или есть что-то еще, что нужно указать при встраивании пакета, что я забыл сделать?
Я использую maven-bundle-плагин
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Bundle-Name>${pom.artifactId}</Bundle-Name>
<Bundle-SymbolicName>${pom.groupId}.${pom.artifactId}</Bundle-SymbolicName>
<Embed-Dependency>
weblogic;scope=*,
</Embed-Dependency>