Как обнаружить типы, экспортируемые OSGi, без установки / активации? - PullRequest
3 голосов
/ 24 апреля 2009

По сути, я хочу узнать, реализует ли jar любое количество интерфейсов без активации или запуска пакета. Можно ли читать метаданные из meta-inf из API так же, как это делает контейнер, но без активации пакета?

Я хочу использовать OSGi для поддержки плагинов, для которых будут опубликованы многочисленные интерфейсы, и я хотел бы знать, какие интерфейсы реализуются пакетом, когда пользователь загружает его без активации пакета и т. Д.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2010

вы можете попробовать что-то вроде ниже. Найдите файлы ".class" в экспортированных пакетах, используя метод bundle.findResource (...).

 BundleContext context = bundle.getBundleContext();
  ServiceReference ref = context.getServiceReference(PackageAdmin.class.getName());
  PackageAdmin packageAdmin = (PackageAdmin)context.getService(ref);
  List<Class> agentClasses = new ArrayList<Class>();
  ExportedPackage[] exportedPackages = packageAdmin.getExportedPackages(bundle);
  for(ExportedPackage ePackage : exportedPackages){
      String packageName = ePackage.getName();
      String packagePath = "/"+packageName.replace('.', '/');
      //find all the class files in current exported package
      Enumeration clazzes = bundle.findEntries(packagePath, "*.class", false);
      while(clazzes.hasMoreElements()){
       URL url = (URL)clazzes.nextElement();
       String path = url.getPath();
       int index = path.lastIndexOf("/");
       int endIndex = path.length()-6;//Strip ".class" substring
       String className = path.substring(index+1, endIndex);
       String fullClassName=packageName+"."+className;
       try {
     Class clazz = bundle.loadClass(fullClassName);
     //check whether the class is annotated with Agent tag.
     if(clazz.isAnnotationPresent(Agent.class))
      agentClasses.add(clazz);
    } catch (ClassNotFoundException e) { 
     e.printStackTrace();
    }
      }
  }
2 голосов
/ 25 апреля 2009

Я не думаю, что можно обнаружить, какие услуги будет предоставлять пакет, потому что это может происходить изнутри кода Java без каких-либо метаданных об этом. Конечно, если вы используете декларативные сервисы, существует файл метаданных. Кроме того, пакет должен импортировать (или предоставить) интерфейс службы, который может дать вам подсказку (но не более).

Вы можете проверить, какие пакеты Java импортирует и экспортирует пакеты, не активируя его. Если вы хотите установить (не разрешить, не активировать) его, вы можете запросить его. Оболочки Феликса или Равноденствия могут перечислять эти пакеты в конце концов.

Вот соответствующий источник из оболочки Феликса . Он использует сервис PackageAdmin:

 public void execute(String s, PrintStream out, PrintStream err)
{
    // Get package admin service.
    ServiceReference ref = m_context.getServiceReference(
        org.osgi.service.packageadmin.PackageAdmin.class.getName());
    PackageAdmin pa = (ref == null) ? null : 
        (PackageAdmin) m_context.getService(ref);

    // ... 

    Bundle bundle = m_context.getBundle( bundleId );
    ExportedPackage[] exports = pa.getExportedPackages(bundle);

    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...