lev*_*and 7 java ant osgi compilation
我正在使用OSGi作为我工作中的最新项目,就模块化和功能而言,它非常漂亮.
但我对开发工作流程并不满意.最终,我计划在依赖图中安排30-50个独立的捆绑包 - 据说,这就是OSGi的设计目标.但我无法弄清楚在编译时管理依赖项的简洁方法.
示例:您具有捆绑包A和B. B依赖于A中定义的包.每个捆绑包都是作为单独的Java项目开发的.
为了编译B,A必须在javac类路径上.
你呢:
5号听起来最干净,但也有很多开销.
小智 7
我的公司有100多个捆绑项目,我们使用Eclipse来管理依赖项.但是,我不建议使用"必需的插件"方法来管理依赖项.最好的办法是创建插件项目.仅导出要显示的每个项目的包.然后在导入端执行以下操作:
打开Manifest编辑器
转到依赖项选项卡左下角是一个名为"自动管理依赖项"的部分
添加当前插件所依赖的任何插件
编写代码后,可以单击该选项卡上的"添加依赖关系"链接以自动计算导入的包.
如果从Eclipse运行,则在执行时会自动完成.
这种方法的好处是你的构建的bundle只使用OSGi定义的包导入/导出机制,而不是Eclipse的东西.
如果您想了解更多信息,我建议您访问此网站并订购该书.这很棒.
好吧,做你应该有很长一段时间的事情,分开实现和API ......好吧,这在现有系统上并不总是那么容易,但是这个模型有很大的优势.一旦你的API在一个单独的(更稳定的)bundle/jar中,你就可以针对该bundle/jar编译客户端和实现.
成功捆绑的一个关键特质是它尽可能少地假设外部世界.这意味着您不必针对在运行时运行的bundle进行编译,我倾向于不努力不这样做.您应该只针对bundle最小的依赖项集进行编译.如果做出假设,则它们显式为导入的包和服务的使用.设计良好的OSGi系统尝试将服务用于所有的捆绑间通信.这个模型不仅摆脱了类加载问题,它还使您的构建设置更加分离.
不幸的是,大多数代码都是作为具有相当宽的接口的库编写的,因为它们手动编写许多服务提供的功能,如工厂和监听器.此代码在实现和API之间存在紧密关系,因此在编译期间和OSGi中必须在类路径上具有相同的代码.这个问题的一个解决方案是使用它在bundle中包含这种代码(但要确保没有这个库的对象泄漏到其他bundle).一点额外的内存消耗,但它可以让您免于一些麻烦.
因此,使用OSGi,尝试创建依赖于服务的系统并针对其服务API进行编译,而不是实现包.
基本上,您可以使用:
但由于二进制依赖关系更加清晰,因此它也是最好由 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)
| 归档时间: |
|
| 查看次数: |
793 次 |
| 最近记录: |