其他分享
首页 > 其他分享> > 如何从头开始使用org.apache.felix.scr注释?

如何从头开始使用org.apache.felix.scr注释?

作者:互联网

我已经开始为apache felix开发一个包,并使用ops4j pax插件.

我用pax-create-project创建了项目结构,并在那里创建了普通的pax-create-bundle.然后你得到了用maven构建整个事物的初始项目结构.这里的重要部分是,你的bundle有它自己的pom(bundlename / pom.xml)和bnd文件(bundlename / osgi.bnd),但maven-bundle-plugin的配置已经在poms / compiled / pom.xml下提供了. .
bundle元数据在poms / compiled / pom.xml下配置,但标准激活器在上面提到的osgi.bnd文件下配置. bnd文件中的默认值是Bundle-Activator:${bundle.namespace} .internal.ExampleActivator.

现在我想开始使用org.apache.felix.scr中的注释,所以我将它包含在依赖项下的bundle自己的pom中:

<dependency>
  <groupId>org.apache.felix</groupId>
  <artifactId>org.apache.felix.scr</artifactId>
  <version>1.6.0</version>
</dependency>

我创建了我的服务接口:

package namespace;

public interface Sample {
  void sayHello();
}

以及使用org.apache.felix.scr中的注释实现:

package namespace.internal;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import namespace.Sample;

@Component
@Service
public class SampleImpl implements Sample{

  @Activate
  void start(){
    System.out.println("Started SampleImpl.");
  }

  @Deactivate
  void stop(){
    System.out.println("Stopped SampleImpl.");
  }

  @Override
  public void sayHello() {
    System.out.println("Hello!");
  }
}

我需要在osgi.bnd文件中放置什么才能启动组件?我不得不删除上面提到的默认条目,因为我不再使用BundleActivator了.

现在问题是:我需要对上述任何文件做什么才能让mvn clean install pax:provision启动一个felix环境,启动我的bundle并让我看到任何打印输出?我已经查看了Apache Log Service的日志输出,我也开始了,它只是告诉我:

2012.09.28 16:52:44 INFO - Bundle: namespace - BundleEvent STARTED
2012.09.28 16:52:44 INFO - Bundle: namespace - BundleEvent RESOLVED

任何提示都非常受欢迎.或链接,我已经搜索了几个小时,找到一个完整的指南,使用scr和捆绑在一起的maven插件.

问候,
Kjellski

解决方法:

这是我对此主题的coderwall写作的修改:http://coderwall.com/p/q39uxq

首先从poms / compiled / pom.xml配置子模块的常规编译配置.将插件添加到maven-bundle-plugin已经存在的位置:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-scr-plugin</artifactId>
    <version><timeofwriting:1.8.0></version>
    <executions>
        <execution>
            <id>generate-scr-scrdescriptor</id>
            <goals>
                <goal>scr</goal>
            </goals>
        </execution>
    </executions>
</plugin>

在同一个文件中,在poms / compiled / pom.xml下,查看maven-bundle-plugin的说明,并在< _include>下添加.声明:

<Service-Component>
    OSGI-INF/serviceComponents.xml
</Service-Component>

现在依赖子项目中的注释来使用它们:

<dependency>
    <groupId>org.apache.felix</groupId>
    <artifactId>org.apache.felix.scr</artifactId>
    <version><timeofwriting:1.6.0></version>
</dependency>
<dependency>
    <groupId>org.apache.felix</groupId>
    <artifactId>
        org.apache.felix.scr.annotations
    </artifactId>
    <version><timeofwriting:1.7.0></version>
</dependency>

现在使用注释@Component和@Service定义组件.当您不想包含任何内容时,就像在任何api包中一样,只需在osgi.bnd文件中插入“Service-Component:*”即可.这将导致bundle插件停止抱怨不包含any的项目缺少OSGI.INF.

希望这有助于某人;)

干杯,
Kjellski

标签:java,maven,osgi,apache-felix,bnd
来源: https://codeday.me/bug/20190901/1785420.html