在扩展现有OSGI服务时,OSGI@Component注释不包括基类所需的引用

在扩展现有OSGI服务时,OSGI@Component注释不包括基类所需的引用,osgi,aem,apache-felix,Osgi,Aem,Apache Felix,我正在尝试扩展OSGI服务。正在扩展的OSGI服务包括一些引用和属性。我正在使用新的org.osgi.service.component.annotations包。OSGi R6实现的注释处理器生成的元XML没有考虑我正在扩展的OSGi服务中的引用和属性声明 ApacheFelixMavenSCR插件很好地处理了这个用例,并且用Felix注释注释的类还包括基类的引用和属性 有没有一种方法可以让它与官方的OSGI注释实现一起工作。我不想退回到Felix SCR插件,除非我必须按照他们的官方网站所说

我正在尝试扩展OSGI服务。正在扩展的OSGI服务包括一些引用和属性。我正在使用新的
org.osgi.service.component.annotations
包。OSGi R6实现的注释处理器生成的元XML没有考虑我正在扩展的OSGi服务中的引用和属性声明

ApacheFelixMavenSCR插件很好地处理了这个用例,并且用Felix注释注释的类还包括基类的引用和属性

有没有一种方法可以让它与官方的OSGI注释实现一起工作。我不想退回到Felix SCR插件,除非我必须按照他们的官方网站所说的那样转到OSGI实现,而这是一个新项目,SCR插件尚未使用

OSGi R6实现的注释处理器生成的元XML没有考虑我正在扩展的OSGi服务中的引用和属性声明

您期望的行为取决于您用来生成XML的构建工具,而不是注释本身。一般来说,基于父类中的注释生成XML不是一个好主意。这是因为位于生成时的父类可能与位于运行时的父类不同。在这种情况下,生成的注入站点可能在运行时不存在,从而导致许多问题。事实上,即使类型相同,也从子类引用父类的私有细节

除此之外,您可能正在使用基于bnd的工具,例如
maven bundle plugin
bnd-maven plugin
来生成XML文件。为了避免我提到的问题,bnd不会在组件的父类中搜索注释,但可以使用以下指令在配置中覆盖此行为:

-dsannotations-options: inherit

如果您添加了该配置选项,那么您应该会看到您想要的行为,但是当父类和子类位于不同的捆绑包中时,强烈建议您不要这样做。

对于在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>

商务英语
bnd-maven插件
3.5.0
运行bnd
bnd工艺

另一个不需要从基类继承注释的选项是在组件本身中重新声明所需的引用:

@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
{...}

明显的缺点是您显式地硬编码超类的实现细节,这可能比在构建时隐式地继承它们更加错误。这样,不仅运行时类可以具有不同于编译时依赖项的字段,而且即使在基类更改的编译时,您也必须确保更新类以反映添加、删除或重命名的字段。

您正在扩展产品服务的服务(默认情况下随AEM提供)?或者它是您源代码中的一项服务?它默认随AEM一起提供。我建议不要扩展它,除非您完全没有其他选择,这些服务会随着新版本的变化而变化,并且当AEM服务发生变化时,您不希望继续更新您的服务。你介意分享它是什么服务吗?我试图通过在maven bundle插件配置的指令部分添加inherit来传递dsannotations options=inherit。我不认为这是传递给bnd的,结果XML仍然是一样的。配置是否应该有所不同?附言:我已经放弃了延长服务期限的计划。我只是想验证一下,然后用POM配置更新答案,并将其标记为正确。根据您给出的语法,我假设您使用的是maven bundle插件。除了你的结束标记中缺少的“u”之外,看起来还不错。您使用的maven bundle插件的版本是什么?我偶尔会看到真正古老的版本在使用,这个选项只是在BND3.0.0(2015年9月)中添加的。我使用的是maven bundle插件。版本是3.5.0。那应该足够新了。其他需要检查的事项是,当插件运行时,您从中继承的类文件在构建路径上可用,并且您从中继承的服务使用标准注释进行注释(不是来自bnd或Felix的类似注释,它们不与标准混合)基类可以使用Felix SCR注释,因为到目前为止,这是AEM的标准设置。