3

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

我已经创建了项目结构,pax-create-project并在其中做了正常的pax-create-bundle. 然后,您将获得使用 maven 构建整个事物的初始项目结构。这里重要的部分是,你的包有它自己的 pom( bundlename/pom.xml) 和 bnd 文件( bundlename/osgi.bnd),但是配置maven-bundle-plugin已经在poms/compiled/pom.xml. 捆绑元数据配置在下,poms/compiled/pom.xml但标准激活器配置在上述osgi.bnd文件下。bnd 文件中的默认值为Bundle-Activator: ${bundle.namespace}.internal.ExampleActivator.

现在我想开始使用注释,org.apache.felix.scr所以我将它包含在依赖项下的捆绑包自己的 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 环境来启动我的包并让我看到任何打印输出?我已经查看了我正在启动的 Apache 日志服务的日志输出,它只是告诉我:

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

任何提示都非常感谢。或者链接,我已经搜索了几个小时来找到一个完整的指南来使用 scr 和捆绑的 maven 插件。

问候,谢尔斯基

4

1 回答 1

5

这是我对这个主题的 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: *”。这将导致捆绑插件停止抱怨不包含任何项目的缺少 OSGI.INF。

希望这可以帮助某人;)

干杯,凯尔斯基

于 2012-09-30T11:11:10.247 回答