2013-06-10 4 views
0

я не знаю, что я делаю это так, как OSGi и Maven, поэтому первый некоторые фон:Доступ свойство ПОМ в OSGi расслоения во время выполнения

У меня есть две связки web и client. В пакете клиента я хочу получить доступ к службе, которую регистрирует веб-узел. Я уже проверил, что я могу реализовать BundleContextAware в связке клиента и, если артефакта веб-Bundle является project.web то следующие работы:

public void setBundleContext(BundleContext bc) { 
    bc.getServiceReferences(clazz, "(Bundle-SymbolicName=project.web)") 

То, что я хотел бы не трудно-код символическое имя веб-расслоением , Символическое название происходит от artifactId, объявленного в pom.xml, я верю в магию магии. Так что моя текущая мысль

  • создать свойство web.artifactId в родительском ПОМ
  • используется пом веб-Bundle в <artifactId>${web.artifactId}</artifactId>
  • каким-то образом получить доступ, что собственность в клиент расслоении-х BundleContextAware.setBundleContext

Как это сделать последний шаг? Я предполагаю, что возможно создать java-файл во время выполнения, который присваивает значение свойства некоторому известному идентификатору, поэтому я могу использовать WebBundleInfo.ARTIFACT_ID; но я не знаю, как это сделать, и задаюсь вопросом, не слишком ли это.

Еще одна мысль - есть ли способ, которым клиентский пакет может использовать System.getProperty для доступа к этому значению? Я видел некоторые ссылки на доступ к файлу свойств, но я не очень увлекаюсь этим - ни при чтении файла свойств, ни при его создании.

Так что мои вопросы: - Это хороший способ поделиться символическим именем этого пакета? - Есть ли возможность автоматически сделать некоторые свойства, созданные в файле pom, доступными для среды выполнения во время выполнения? - Я думаю, я мог бы выяснить, как сгенерировать такой исходный файл, но это хороший способ решить это? Есть ли способ создать такой файл без исходного файла, то есть из некоторого текста в самом pom.xml? Кроме того, можно ли перезаписать существующий файл только в том случае, если он изменился, чтобы избежать перекомпиляции, потому что после каждой компиляции это закончится новой версией моментального снимка?

ответ

2

Самый простой способ установить переменные во время компиляции - убедиться, что они оказались в манифесте пакета. Как вы говорите, Bundle-SymbolicName уже делает. Для клиентского пакета вам, вероятно, следует создать новый настраиваемый заголовок, содержащий вашу переменную. Тогда, с вашего клиента пачке, вы могли бы сделать что-то вроде этого:

public void setBundleContext(BundleContext bc) { 
    String filter = (String) bc.getBundle().getHeaders().get("MyCustomHeader"); 
    bc.getServiceReferences(clazz, filter); 
} 

Это, как говорится, вы могли бы объяснить немного больше о том, что вы пытаетесь сделать (на более высоком уровне), потому что я не вижу почему вы не просто используете службы OSGi и зависимости (используя Declarative Services, Blueprint или какую-то другую инфраструктуру инъекций зависимостей)?

+0

Это, кажется, то, что я ищу. Как мне получить что-то в манифесте пакета? В контейнере много пакетов, из которых я хочу заключить договор между веб-и клиентским пакетом и получить ссылку на услугу, зарегистрированную веб-пакетом. В java-коде в клиентском пакете я не хочу жестко кодировать символическое имя веб-пакета. –

+0

Предполагая, что вы используете Apache Felix «maven-bundle-plugin», вы можете добавить свой собственный заголовок в инструкции в вашем pom.xml: <инструкции> (someKey = someValue)

+0

Perfect. Я использовал ' $ {web.artifactId}' в веб-пакете и ' $ {web.artifactId}' в инструкциях maven-bundle-plugin. Можете ли вы прокомментировать, если это плохо, чтобы добраться до других пакетов по их именам? –

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