一、开发环境准备
- JDK:建议JDK 8或以上。
- Eclipse IDE(推荐,内置OSGi插件开发支持)或IntelliJ IDEA。
- OSGi框架:如Apache Felix或Eclipse Equinox。
- Maven(用于依赖管理和打包)。
二、OSGi项目结构
一般来说,一个OSGi项目包含多个Bundle(jar包),每个Bundle可独立部署和升级。
service.api:服务接口Bundleservice.impl:服务实现Bundleservice.consumer:服务消费Bundle
三、创建第一个Bundle(以Maven为例)
1. 新建Maven项目(以service.api为例)
pom.xml 关键配置:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.osgi</groupId>
<artifactId>service.api</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<dependencies>
<!-- OSGi core -->
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>5.1.2</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 编写服务接口
src/main/java/com/example/osgi/service/api/GreetingService.java
package com.example.osgi.service.api;
public interface GreetingService {
String sayHello(String name);
}
四、实现服务(service.impl)
1. 新建Maven项目,依赖service.api
pom.xml 依赖增加:
<dependency>
<groupId>com.example.osgi</groupId>
<artifactId>service.api</artifactId>
<version>1.0.0</version>
</dependency>
2. 编写实现类和Activator
GreetingServiceImpl.java
package com.example.osgi.service.impl;
import com.example.osgi.service.api.GreetingService;
public class GreetingServiceImpl implements GreetingService {
public String sayHello(String name) {
return "Hello, " + name + "!";
}
}
Activator.java
package com.example.osgi.service.impl;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import com.example.osgi.service.api.GreetingService;
public class Activator implements BundleActivator {
private org.osgi.framework.ServiceRegistration registration;
public void start(BundleContext context) throws Exception {
GreetingService service = new GreetingServiceImpl();
registration = context.registerService(GreetingService.class.getName(), service, null);
System.out.println("GreetingService registered.");
}
public void stop(BundleContext context) throws Exception {
registration.unregister();
System.out.println("GreetingService unregistered.");
}
}
注意:需要在META-INF/MANIFEST.MF中声明:
Bundle-Activator: com.example.osgi.service.impl.Activator
Import-Package: org.osgi.framework,com.example.osgi.service.api
五、消费服务(service.consumer)
1. 新建Maven项目,依赖service.api
pom.xml 同上。
2. 编写Activator
package com.example.osgi.service.consumer;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import com.example.osgi.service.api.GreetingService;
public class Activator implements BundleActivator {
public void start(BundleContext context) throws Exception {
ServiceReference reference = context.getServiceReference(GreetingService.class.getName());
if (reference != null) {
GreetingService service = (GreetingService) context.getService(reference);
System.out.println(service.sayHello("OSGi"));
} else {
System.out.println("GreetingService not found.");
}
}
public void stop(BundleContext context) throws Exception {
// 清理资源
}
}
META-INF/MANIFEST.MF 需声明:
Bundle-Activator: com.example.osgi.service.consumer.Activator
Import-Package: org.osgi.framework,com.example.osgi.service.api
六、部署与运行
- 打包:
mvn clean install,生成jar包。 - 下载OSGi框架:如Apache Felix。
- 启动框架:
java -jar bin/felix.jar - 安装Bundle:
install file:/path/to/service.api-1.0.0.jar
install file:/path/to/service.impl-1.0.0.jar
install file:/path/to/service.consumer-1.0.0.jar
- 启动Bundle:
start <bundle-id>
七、效果
控制台会输出:
GreetingService registered.
Hello, OSGi!
八、进阶
- 动态服务追踪:用
ServiceTracker动态追踪服务注册与注销。 - Declarative Services (DS):用注解和XML简化服务声明。
- Blueprint/Dependency Injection:集成Spring等IOC容器。
九、ServiceTracker动态服务追踪
在实际项目中,服务可能随时注册/注销,直接用getServiceReference不够灵活。OSGi提供了ServiceTracker来动态追踪服务。
示例代码
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
import com.example.osgi.service.api.GreetingService;
public class Activator implements BundleActivator {
private ServiceTracker<GreetingService, GreetingService> tracker;
public void start(BundleContext context) throws Exception {
tracker = new ServiceTracker<>(context, GreetingService.class, null);
tracker.open();
GreetingService service = tracker.getService();
if (service != null) {
System.out.println(service.sayHello("ServiceTracker"));
}
}
public void stop(BundleContext context) throws Exception {
tracker.close();
}
}
ServiceTracker会自动监听服务的注册和注销,非常适合动态环境。
十、Declarative Services(DS)注解开发
Declarative Services是OSGi推荐的服务开发方式,简化了服务注册/引用。常用注解有@Component、@Activate、@Deactivate、@Reference。
步骤
- 引入OSGi DS依赖(如
org.osgi.service.component.annotations)。 - 用注解声明服务和依赖。
示例
GreetingServiceImpl.java
import org.osgi.service.component.annotations.Component;
import com.example.osgi.service.api.GreetingService;
@Component(service = GreetingService.class)
public class GreetingServiceImpl implements GreetingService {
public String sayHello(String name) {
return "Hello, " + name + "!";
}
}
Consumer.java
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import com.example.osgi.service.api.GreetingService;
@Component
public class Consumer {
private GreetingService greetingService;
@Reference
public void setGreetingService(GreetingService service) {
this.greetingService = service;
}
@Activate
public void activate() {
System.out.println(greetingService.sayHello("Declarative Services"));
}
}
优点:无需手动写Activator,服务自动注册与注入。
注意:需要在pom.xml中增加DS插件:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-scr-plugin</artifactId>
<version>1.24.0</version>
<executions>
<execution>
<goals>
<goal>scr</goal>
</goals>
</execution>
</executions>
</plugin>
十一、OSGi事件机制
OSGi支持事件发布与订阅,常用的有EventAdmin服务。
发布事件
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
import java.util.Dictionary;
import java.util.Hashtable;
public void sendEvent(EventAdmin eventAdmin) {
Dictionary<String, Object> props = new Hashtable<>();
props.put("message", "Hello EventAdmin");
Event event = new Event("com/example/osgi/HELLO", props);
eventAdmin.postEvent(event);
}
监听事件
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import org.osgi.service.component.annotations.Component;
@Component(
service = EventHandler.class,
property = "event.topics=com/example/osgi/HELLO"
)
public class HelloEventHandler implements EventHandler {
public void handleEvent(Event event) {
System.out.println("Received: " + event.getProperty("message"));
}
}
十二、OSGi配置管理(Config Admin)
可以通过Config Admin动态配置服务参数。
服务接收配置
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Modified;
import org.osgi.service.component.annotations.ConfigurationPolicy;
import java.util.Map;
@Component(
configurationPolicy = ConfigurationPolicy.REQUIRE,
configurationPid = "com.example.osgi.greeting"
)
public class GreetingConfigService {
private String prefix = "Hello";
@Activate
@Modified
public void activate(Map<String, Object> config) {
if (config.containsKey("prefix")) {
prefix = (String) config.get("prefix");
}
}
public String sayHello(String name) {
return prefix + ", " + name + "!";
}
}
配置方式
可通过OSGi控制台、Web管理界面或直接编辑配置文件(如Felix的config.properties)进行配置。
十三、与Spring集成
OSGi支持与Spring等主流框架集成,推荐使用Spring DM或Blueprint。
示例
- 在Bundle中加入Spring配置文件(如
META-INF/spring/*.xml)。 - 在
pom.xml中增加Spring DM依赖。 - 在Activator或Declarative Services中引用Spring Bean。
十四、OSGi常用命令(以Felix为例)
| 命令 | 说明 |
|---|---|
ps | 查看所有Bundle状态 |
install | 安装Bundle |
start | 启动Bundle |
stop | 停止Bundle |
uninstall | 卸载Bundle |
update | 更新Bundle |
十五、常见问题及调试技巧
- 依赖未导入:检查
Import-Package或Require-Bundle声明。 - 服务未注册:Activator或DS注解有误,检查日志。
- Bundle启动失败:查看OSGi控制台日志,定位
NoClassDefFoundError或ClassNotFoundException。 - 热部署:直接
update或uninstall/installBundle,无需重启整个系统。
十六、总结
OSGi开发的核心流程是:
接口 → 实现 → 服务注册 → 服务消费 → 动态部署
通过上述步骤,你可以快速上手OSGi基础开发。如果有更复杂的需求(如热部署、服务监听、集成Spring等),可以进一步学习OSGi的高级特性。
OSGi是一套强大的Java模块化和服务框架,适用于动态插件、微服务、企业级应用等场景。
开发流程可以从基础的Activator开发,逐步升级到DS注解、事件管理、配置管理和与Spring集成等高级特性。
125

被折叠的 条评论
为什么被折叠?



