Ошибка ServiceLoader в WebLogic12c
Я пытался изменить нашу реализацию Activiti на использование CDI, но столкнулся с рядом проблем. Я потратил слишком много времени, пытаясь решить эту проблему уже, но я просто не могу отпустить это... Я думаю, что я наметил проблему сейчас, настраивая чистую структурированную войну без вовлечения Activiti и смог воспроизвести то, что я считаю главной проблемой.
В основном у меня есть jar1 и jar2, оба CDI включены, включая META-INF/beans.xml. Оба jar указывают класс в META-INF/services/test.TheTest, указывающий на реализации, локальные для соответствующего jar. jar1 зависит от jar2. Кроме того, обе банки указывают на реализацию javax.enterprise.inject.spi.Extension, запускающего сценарий. В каждой реализации расширения у меня есть такой метод:
public void afterDeploymentValidation(
@Observes AfterDeploymentValidation event, BeanManager beanManager) {
System.out.println("In jar1 extension");
ServiceLoader<TheTest> loader = ServiceLoader.load(TheTest.class);
Iterator<TheTest> serviceIterator = loader.iterator();
List<TheTest> discoveredLookups = new ArrayList<TheTest>();
while (serviceIterator.hasNext()) {
TheTest serviceInstance = (TheTest) serviceIterator.next();
discoveredLookups.add(serviceInstance);
System.out.println(serviceInstance.getClass().getName());
}
}
Теперь моя проблема в том, что ServiceLoader
не видит каких-либо реализаций ни в одном из случаев при запуске WebLogic12c. Один и тот же код прекрасно работает как в Jboss 7.1.1, так и в Glassfish, в котором перечислены обе реализации теста. Интерфейс TheTest.
Справедливо ли предположить, что это действительно проблема в WebLogic 12c или я что-то не так делаю? Пожалуйста, помните, что я просто пытаюсь подражать производственной настройке, которую мы используем при включении Activiti.
С уважением, / Петтер
1 ответ
Существует инструмент анализа Classloader, поставляемый с WLS, вы видели, поможет ли это в диагностике вашей проблемы.
Вы можете получить доступ к этому инструменту, перейдя в ip:port/wls-cat/index.jsp, где port будет портом управляемого сервера, на котором развернуто ваше приложение.