2012-07-16 6 views
0

Есть intefrace MyIntefrace.JBoss 7 ServiceLoader

Система имеет несколько EAR, каждая из которых имеет собственные реализации этой функции. Мне нужно найти все реализации без их имен (? Extends MyInterface).

я решил использовать java.util.ServiceLoader и создал банку с META-INF/услуги/com.example.MyInterface внутри него, муравей этот сосуд может быть развернут в любом из колосьев.

Сосуд имеет сервлет и следующий код внутри метода инициализации INT в:

ServiceLoader<MyInterface > loader = ServiceLoader.load(MyInterface .class); 
Iterator<MyInterface > it = loader.iterator(); 

Но итератор еще пусты ..

I судимого добавить услуги/com.example.MyInterface в Ушах META-INF , но результат тот же.

Этот подход отлично работает в jboss 6 и tomcat.

+0

Вы нашли решение этой проблемы? – Rhys

+0

каждый EAR должен иметь META-INF/services/com.example.MyInterface текстовый файл с перечислением всех реализаций внутри этого EAR –

+0

Вы говорите, что с использованием архитектуры ServiceLoader вы могли обнаружить сервисы между отдельными развертываниями EAR? то есть EAR1 может найти службы в EAR2, не объявляя прямую зависимость друг от друга? (через манифест или jboss-deployment-structure.xml) – Rhys

ответ

3

Когда я была такая же проблема, она была решена, пытаясь lazyloading

private static class LoaderHolder { 
    ServiceLoader<MyInterface > loader = ServiceLoader.load(MyInterface .class); 
    } 

Iterator<MyInterface > it = LoaderHolder .loader.iterator();