我试图扩展OSGI服务。正在扩展的OSGI服务包括一些引用和属性。我正在使用新的org.osgi.service.component.annotations
包。由OSGi R6实现的注释处理器生成的元XML不考虑在我扩展的OSGI服务中进行的引用和属性声明。
Apache Felix Maven SCR插件很好地处理了这个用例,并且使用Felix注释注释的类也包括基类的引用和属性。
有没有办法让这个工作与官方的OSGI注释实现。我不想回退到Felix SCR插件,除非我必须像他们的官方网站所说的那样转向OSGI实现,这是一个尚未使用SCR插件的新项目。
答案 0 :(得分:5)
OSGi R6实现的注释处理器生成的元XML没有考虑我在OSGI服务中进行的引用和属性声明。
您期望的行为取决于您用于生成XML的构建工具,而不是注释本身。通常,基于父类中的注释生成XML不是一个好主意。这是因为位于构建时的父类可能与位于运行时的父类不同。在这种情况下,生成的注入站点可能实际上并不存在于运行时,从而导致许多问题。事实上,即使类型相同,您也可以从子类引用父类的私有详细信息。
除了这个警告之外,你可能正在使用基于bnd的工具,例如maven-bundle-plugin
或bnd-maven-plugin
来生成XML文件。为了避免我提到的问题,bnd不会在组件的父类中搜索注释,但可以使用以下指令在配置中覆盖此行为:
-dsannotations-options: inherit
如果您添加了该配置选项,那么您应该会看到所需的行为,但是当强烈建议您在父类和子类位于不同的包中时,不要这样做。< / p>
答案 1 :(得分:1)
另一个不需要从基类继承注释的选项是在组件本身中重新声明所需的引用:
@Component(
service = SomeService.class,
reference = {
@Reference(
name = "baseClassField",
field = "baseClassField",
service = SomeOtherService.class
),
@Reference(
name = "otherBaseClassField",
field = "otherBaseClassField",
service = YetAnotherService.class,
cardinality=ReferenceCardinality.MULTIPLE,
policy=ReferencePolicy.DYNAMIC
)
}
)
public class MyServiceImplementation
extends AbstractSomeServiceBaseImpl
implements SomeService
{...}
一个明显的缺点是您显式地对超类的实现细节进行硬编码,这可能比在构建时隐式继承它们更为错误。这样,运行时类不仅可以具有与编译时依赖项不同的字段,而且即使在基类更改时的编译时,也必须确保更新类以反映添加,删除或重命名的字段。
答案 2 :(得分:0)
要在maven中使用,您可以这样定义:
<plugins>
<plugin>
<groupId>biz.aQute.bnd</groupId>
<artifactId>bnd-maven-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<id>run-bnd</id>
<goals>
<goal>bnd-process</goal>
</goals>
</execution>
</executions>
<configuration>
<bnd><![CDATA[-dsannotations-options: inherit]]></bnd>
</configuration>
</plugin>
</plugins>