什么是合理的OSGi开发工作流程?

lev*_*and 7 java ant osgi compilation

我正在使用OSGi作为我工作中的最新项目,就模块化和功能而言,它非常漂亮.

但我对开发工作流程并不满意.最终,我计划在依赖图中安排30-50个独立的捆绑包 - 据说,这就是OSGi的设计目标.但我无法弄清楚在编译时管理依赖项的简洁方法.

示例:您具有捆绑包A和B. B依赖于A中定义的包.每个捆绑包都是作为单独的Java项目开发的.

为了编译B,A必须在javac类路径上.

你呢:

  1. 在B的构建脚本中引用项目A的文件系统位置?
  2. 构建A并将jar放入B的lib目录中?
  3. 依靠Eclipse的"引用项目"功能并始终使用Eclipse的类路径来构建(呃)
  4. 对所有项目使用一个通用的"lib"目录,并在编译后将bundle jars转储到那里?
  5. 设置一个bundle repository,从构建脚本解析清单并从存储库中下载所需的bundle?

5号听起来最干净,但也有很多开销.

小智 7

我的公司有100多个捆绑项目,我们使用Eclipse来管理依赖项.但是,我不建议使用"必需的插件"方法来管理依赖项.最好的办法是创建插件项目.仅导出要显示的每个项目的包.然后在导入端执行以下操作:

打开Manifest编辑器

转到依赖项选项卡左下角是一个名为"自动管理依赖项"的部分

添加当前插件所依赖的任何插件

编写代码后,可以单击该选项卡上的"添加依赖关系"链接以自动计算导入的包.

如果从Eclipse运行,则在执行时会自动完成.

这种方法的好处是你的构建的bundle只使用OSGi定义的包导入/导出机制,而不是Eclipse的东西.

如果您想了解更多信息,我建议您访问此网站并订购该书.这很棒.

http://equinoxosgi.org/


Pet*_*ens 5

好吧,做你应该有很长一段时间的事情,分开实现和API ......好吧,这在现有系统上并不总是那么容易,但是这个模型有很大的优势.一旦你的API在一个单独的(更稳定的)bundle/jar中,你就可以针对该bundle/jar编译客户端和实现.

成功捆绑的一个关键特质是它尽可能少地假设外部世界.这意味着您不必针对在运行时运行的bundle进行编译,我倾向于不努力不这样做.您应该只针对bundle最小的依赖项集进行编译.如果做出假设,则它们显式为导入的包和服务的使用.设计良好的OSGi系统尝试将服务用于所有的捆绑间通信.这个模型不仅摆脱了类加载问题,它还使您的构建设置更加分离.

不幸的是,大多数代码都是作为具有相当宽的接口的库编写的,因为它们手动编写许多服务提供的功能,如工厂和监听器.此代码在实现和API之间存在紧密关系,因此在编译期间和OSGi中必须在类路径上具有相同的代码.这个问题的一个解决方案是使用它在bundle中包含这种代码(但要确保没有这个库的对象泄漏到其他bundle).一点额外的内存消耗,但它可以让您免于一些麻烦.

因此,使用OSGi,尝试创建依赖于服务的系统并针对其服务API进行编译,而不是实现包.


Von*_*onC 2

基本上,您可以使用:

  • 源依赖(使用 Eclipse 的“引用项目”)
  • 二进制依赖(使用bundle A的jar)

但由于二进制依赖关系更加清晰,因此它也是最好由 Maven 等发布管理框架管理的依赖关系。
您可以通过m2eclipse将 Maven 集成到您的 Eclipse 项目中。

要使用的 Maven 插件将是:maven-bundle-plugin,您可以在以下位置看到它的实际效果:

考虑这个使用 Felix 日志服务实现的更真实的示例。
日志服务项目由单个包组成:org.apache.felix.log.impl.
它依赖于核心 OSGi 接口以及特定日志服务接口的概要 OSGi 接口。下面是它的POM文件:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.apache.felix</groupId>
  <artifactId>org.apache.felix.log</artifactId>
  <packaging>bundle</packaging>
  <name>Apache Felix Log Service</name>
  <version>0.8.0-SNAPSHOT</version>
  <description>
    This bundle provides an implementation of the OSGi R4 Log service.
  </description>
  <dependencies>
    <dependency>
      <groupId>${pom.groupId}</groupId>
      <artifactId>org.osgi.core</artifactId>
      <version>0.8.0-incubator</version>
    </dependency>
    <dependency>
      <groupId>${pom.groupId}</groupId>
      <artifactId>org.osgi.compendium</artifactId>
      <version>0.9.0-incubator-SNAPSHOT</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
          <instructions>
            <Export-Package>org.osgi.service.log</Export-Package>
            <Private-Package>org.apache.felix.log.impl</Private-Package>
            <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
            <Bundle-Activator>${pom.artifactId}.impl.Activator</Bundle-Activator>
            <Export-Service>org.osgi.service.log.LogService,org.osgi.service.log.LogReaderService</Export-Service>
          </instructions>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
Run Code Online (Sandbox Code Playgroud)