å©ç¨ R-OSGi å®ç°åå¸å¼ OSGi åºç¨
OSGiï¼Open Service Gateway Initiativeï¼æ¯ä¸ç䏿ç¥åç Java 模ååææ¯è§èï¼å ¶æ ¸å¿è®¾è®¡ææ³æ¯é¢åæå¡çç»ä»¶æ¨¡åï¼Service-Oriented Component Modelï¼ãOSGi åå±è³ä»å·²ç»å¾å°äºä¼å¤ä¼ä¸ï¼ååï¼å¼æºç»ç»çæ¯æï¼å°¤å ¶å½ä¸»æµç Java åºç¨æå¡å¨é½éç¨ OSGi æ¶ï¼OSGi 俨ç¶å·²ç»æä¸º Java 模ååçæ åã
OSGi v4.2 è§èä¸å®ä¹äºè¿ç¨è°ç¨çç»ä¸æ åï¼ä½¿æ¨¡ååææ³è¿ä¸æ¥å¾å°æ·±åãR-OSGi ä½ä¸ºå ¶ä¸çä¸ç§å®ç°ï¼æä¾äºé¢å Service çè¿ç¨è°ç¨ç»ä»¶ï¼è®©æä»¬è½é常ç®åå°å®ç°å¤äºä¸åå°åç两个 OSGi service çäºç¸è°ç¨ã æ¬æéè¿ä»ç»ä¼ ç» OSGi åºç¨ç¨åºå R-OSGi çå®ç°æ¹å¼å ¥æï¼éè¿°äº R-OSGi å¯¹äº OSGi è§èçå®ç°æ¹å¼ãç¶åéè¿ä¸ä¸ªç®åçåè½å®ç°ç±æµ å ¥æ·±å°è®²è¿°ä¼ ç» OSGi å R-OSGi ä¸ç两ç§ä¸åå®ç°ï¼è®©æ¨å¯¹å®é æä½å æ·±å°è±¡ãæåï¼æ¢è®¨äº R-OSGi çç®åä½¿ç¨æ åµä»¥åæ´ä¸ªåå¸å¼ OSGi åºç¨çåå±åæ¯ãæè½ä¸å¹¿å¤§è¯»è ä¸èµ·åè¿ä¸æ¥ç讨论åç ç©¶ã
ä¼ ç»åºäº OSGi çåºç¨ç¨åºæ¶æå¦ä¸å¾æç¤ºï¼
å¾ 1. åºäº OSGi çåºç¨ç¨åºæ¶æ
è¿å¥æ¶æä½ç³»å¨è®¸å¤ä¼ä¸ç大å项ç®ä¸å¹¿æ³ä½¿ç¨ççåæ¶ï¼å½ OSGi ç Bundleï¼OSGi ä¸ç模åï¼å ·æç¬ç«è¿è¡å¤çä¸å¡é»è¾çåå ç»ä»¶ï¼éçå¼åå¢å¤æ¶ï¼æ¸æ¸åç°äºä»¥ä¸é®é¢ï¼
- ç¨åºæ´ä½è¿è¡ç¼æ ¢
- è¿è¡æ¶ä¸ç¨³å®
- è¾é¾å®ä½è¿è¡æ¶é误
- åºå¤§ç¨åºä¸»ä½åå¸å°é¾ã
æä»¬å¨æèçææ²¡æä¸ç§æ¡æ¶è½å¤å°ä¸ä¸ªç¬ç«è¿è¡ç OSGi åºç¨ç¨åºå岿è¥å¹²ä¸ªï¼æ¯ä¸ªåå¸å¼åºç¨æä¾èªå·±ç¬ç«é¢åç Serviceï¼å¦æè½æ¾å°éåçå岿¹æ³ï¼ç论ä¸å¯ä»¥è§£å³ä¸é¢æè¿°çé®é¢ã
è R-OSGi å°±æ¯å·²ç»å®ç°è¿æ ·åè½çä¸ä¸ªæ¡æ¶ï¼æ¥ä¸æ¥è®©æä»¬æ¥äºè§£ä¸ R-OSGiã
ä½¿ç¨ R-OSGi å®ç°åå¸å¼ OSGi åºç¨ç¨åº
R-OSGi æ¯ä¸å¥éç¨äºä»»ææ»¡è¶³ OSGi æ¶æçåå¸å¼é讯ç»ä»¶ãå®ä»¥ jar çå½¢å¼åå¸ï¼é¨ç½²å®¹æï¼ä½¿ç¨ä¹è¾ä¸ºä¾¿æ·ã
æ¦æ¬ä¸ç¨æ·åªéè¦å®æå¦ä¸å æ¥ã
å¨ Server 端ï¼
- OSGi 容å¨å å¯å¨ R-OSGi ç Bundle
- Service ç Bundle é MENIFEST æä»¶ä¸ import 对 R-OSGi çå¼ç¨
- å°éè¦è¢« Client è°ç¨çæ¥å£æ´é²ç» R-OSGi 模åå³å¯ã
å¨ Client 端ï¼
- OSGi 容å¨å å¯å¨ R-OSGi ç Bundle
- Client ç Bundle é MENIFEST æä»¶ä¸ import 对 R-OSGi çå¼ç¨
- åå¾ R-OSGi æ´é²ç Service è°ç¨æ¥å£å³å¯
ä¸å¾ç®è¦è¯´æäº R-OSGi å®ç°çæµç¨ååçï¼
å¾ 2. R-OSGi å®ç°æµç¨
- è¿ç¨ Service éè¿ R-OSGi æ¡æ¶æ³¨åå° OGSi 容å¨ã
- R-OSGi å¨ OS 䏿å¼ä¸ä¸ªç«¯å£ï¼é»è®¤ 9278ï¼æ¥å建 Socket çå¬å¨ã
- Client 端 Bundle å¯å¨æ¶è°ç¨æå® Server çé»è®¤ç«¯å£ï¼è¯·æ± Socket éä¿¡ã
- 卿¬ OSGi 容å¨å çæä¸ä¸ªä»£ç Bundleï¼ç¨äºæ¬å° Client è°ç¨ã
- å¨ Client 端注åç¾å䏿 ·ç Serviceã
- 客æ·ç«¯è°ç¨ Serviceï¼å®é ä¸è°ç¨çæ¯éè¿ä»£ç Bundle è°ç¨è¿ç¨ç Serviceï¼çå¾ é讯è¿åã
ä½¿ç¨ R-OSGi æ¥å建第ä¸ä¸ªåå¸å¼ OSGi åºç¨
æ¥ä¸æ¥æä»¬æ¥å建ä¸ä¸ªç®åç Client-Service è°ç¨å®ä¾ OSGi åºç¨ç¨åºï¼å¹¶ä¸å¨ç¨åæ Service ç§»å°å«å¤ï¼éè¿ R-OSGi è¿è¡è¿ç¨è°ç¨ï¼è Client æµç¶ä¸ç¥è°ç¨ Service çå°æ¹ï¼å´è½æ£å¸¸å®ææ´ä¸ª Service è°ç¨è¿ç¨ã
å¦ä¸å¾å®ä¾ï¼
å¾ 3. å°ä¸ä¸ªç®å OSGi åºç¨æ¹ä¸ºåºäº R-OSGi çåå¸å¼åºç¨
卿¬ç¤ºä¾ä¸ä¸å ±å å«ä¸¤ä¸ª BundleãCustomer Bundle å Service Bundleï¼Customer Bundle å¯å¨åç¨æ·å¯ä»¥å¨ HTTP 容å¨å 访é®ä¸å¼ åªå¸¦ææ±ååè½ç页é¢ãè Service Bundle åæä¾å½ç¨æ·ç¹å»æ±åæé®åçå ·ä½é»è¾æå¡ã
å¨ Eclipse ä¸å»ºç«ä¸ä¸ä¸¤ä¸ª Bundleï¼
å¾ 4. Eclipse ä¸å»ºç« 2 个 Bundle
Customer Bundle
Customer Bundle æä¾ä¸å¼ å¸¦ææ±ååè½ç页é¢ãå¹¶æ¥ååæ°ï¼è°ç¨ Service æ¥å£ã以ä¸ç¤ºä¾äºå ³é®ä»£ç ã
æ¸ å 1. operation.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Demo</title>
</head>
<body>
<h3>Click to consume the Service</h3>
<form action="/ServiceServlet" method="get">
<p><input type="text" name="number1" /></p> +
<p><input type="text" name="number2" /></p>
<input type="submit" value="equals"/>
</form>
</body>
</html>
说æï¼operation.html æä¾äºå¸¦ææ±ååè½ç html 代ç
æ¸ å 2. ServiceServlet.java
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String n1 = req.getParameter("number1");
String n2 = req.getParameter("number2");
int result = new MathImpl().sum(Integer.parseInt(n1), Integer.parseInt(n2));
resp.setContentType("text/html");
resp.getWriter().println("<h3>Result:</h3>" + result);
}
说æï¼ServiceServlet.java æ¯ html ä¸ Form ç请æ±ååºç Servletï¼ç¨æ¥è°ç¨ Service æ¥å£
æ¸ å 3. plugin.xml
<plugin>
<extension
id="helloServlet"
point="org.eclipse.equinox.http.registry.servlets">
<servlet alias="/ServiceServlet"
class="com.ibm.sample.http.ServiceServlet">
</servlet>
</extension>
<extension id="helloResource"
point="org.eclipse.equinox.http.registry.resources">
<resource alias="/sample.html"
base-name="/web/operation.html" />
</extension>
</plugin>
说æï¼é ç½® plugin.xml å°èµæºæ³¨åå° OSGi èªå¸¦ç web application 容å¨éã
æ¸ å 4. MANIFEST.MF
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Customer
Bundle-SymbolicName: Customer;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.ibm.sample.customer.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: com.ibm.sample.service.calculate,
javax.servlet;version="2.5.0",
javax.servlet.http;version="2.5.0",
org.osgi.framework;version="1.3.0",
org.osgi.service.http;version="1.2.1"
Bundle-ActivationPolicy: lazy
Require-Bundle: org.eclipse.equinox.http.registry;bundle-version="1.1.0",
org.mortbay.jetty.server;bundle-version="6.1.23",
org.eclipse.equinox.http.jetty;bundle-version="2.0.0",
org.eclipse.equinox.http.servlet;bundle-version="1.1.0"
说æï¼ Customer Bundle ç MANIFEST.MF å¼ç¨äº Service ç Package å HTTP ç¨å°ç Bundle
Service Bundle
Service Bundle æä¾äºå½ç¨æ·ç¹å»æ±åæé®åçå ·ä½é»è¾æå¡ãæ¬ç¤ºä¾éå°±æ¯ç®åçå æ³æ±åã
æ¸ å 5. MathImpl.java
package com.ibm.sample.service.calculate;
public class MathImpl {
public int sum(int a, int b) {
return a + b;
}
public int quadrature(int a, int b) {
return a*b;
}
}
æ¸ å 6. MANIFEST.MF
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Service
Bundle-SymbolicName: Service
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.ibm.sample.service.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-ActivationPolicy: lazy
Export-Package: com.ibm.sample.service.calculate
说æï¼Service Bundle export äº com.ibm.sample.service.calculate æ¥å£ï¼ä¾ Customer Bundle 使ç¨ã
å¯å¨å®ä¾
Eclipse éæäºåºäº Equinox ç OSGi æ¡æ¶ï¼ä½¿ç¨å¦ä¸æ¹å¼å¯ä»¥å¨ Eclipse ä¸å¯å¨ OSGi 容å¨ã
å¾ 5. å¨ Eclipse ä¸å¯å¨ OSGi å®ä¾
å¨ OSGi Framework 䏿°å»ºä¸ä¸ªå为 Local ç run configurationï¼å å« Customer å Service 两个 Bundleï¼ç¹å» Run æé®ã
çå°æåå¯å¨ä¿¡æ¯åï¼å¨æµè§å¨ä¸æå¼ï¼http://localhost/sample.html
å¾ 6. ç¨æ·çé¢
å¾ 7. æåè°ç¨ Service
å½åºç°å¦ä¸æ£ç¡®æ±åç»æåï¼è¯´ææåçè°ç¨äºæ¬å°ç Serviceã
æ¥ä¸æ¥æä»¬æè¿ä¸ªæ¨¡å¼æ¹æå©ç¨ R-OSGi çè¿ç¨è°ç¨æ¨¡å¼ã
åºç¨ R-OSGi åçåå¸å¼åºç¨å®ä¾
为äºè½¬å为åå¸å¼ç OSGi åºç¨ï¼æä»¬ä¸éè¦ä¿®æ¹åæç Customer å Service Bundleï¼åªè¦å¨å ¶åºç¡ä¸å¦æ·»å 两个 Bundleï¼LocalService Bundle å Remote Service Bundleã
- LocalService Bundle å å«äº R-OSGi 模åï¼è´è´£æ¥æ¶æ¬å° Customer ç请æ±å¹¶è°ç¨è¿ç¨æ¨¡åã
- RemoteService Bundle ä¹å å«äº R-OSGi 模åï¼è´è´£æ¥åè¿ç¨ Customer 忥ç请æ±å¹¶è°ç¨æ¬å° Service 模åï¼å¹¶å°å ¶ç»æè¿åç» Customer 模åã
ç®å¾å¦ä¸æç¤ºï¼
å¾ 8. 转æ¢ç¤ºä¾
å®ç°è¿ç¨è°ç¨çæ¥éª¤å¤§è´å¦ä¸ï¼
- å° Service Bundle æ¾å°è¿ç¨ OSGi è¿è¡ç¯å¢ä¸ï¼å¯¼å ¥ R-OSGi çè¿è¡ Bundleã
-
卿³¨åè¿ç¨ Service çæ¶åï¼å å
¥ä»¥ä¸å£°æï¼
properties.put(RemoteOSGiService.R_OSGi_REGISTRATION, Boolean.TRUE);
- å° Customer Bundle æ¾å°æ¬å° OSGi è¿è¡ç¯å¢ä¸ï¼å¯¼å ¥ R-OSGi çè¿è¡ Bundleã
-
è¾å
¥ Service 端ç URIï¼éè¿ä»¥ä¸æ¥å£åå¾ Serviceï¼è°ç¨è¿ç¨æ¹æ³ï¼
remoteSvc.getRemoteServiceReferences(new URI("r-osgi://localhost:9278"), "com.ibm.sample.service.calculate.interfaces.IMathImpl", null);
æ¥ä¸æ¥å°±å ·ä½è¯´æè¿äºæ¥éª¤çå®ç°æ¹æ³ã
è¿ç¨ OSGi
卿¬å°èï¼å°ä¼å建ä¸ä¸ªå为 RemoteService ç Bundleï¼è¿åä¹åå建ç Service Bundle ä¸èµ·ç»æè¿ç¨ OSGi ç¨äºæä¾ Serviceï¼è¿ç¨ OSGi å°ä¼å¯å¨å¦ä¸ä¸¤ä¸ª Bundleã
å¾ 9. è¿ç¨ OSGi å¯å¨ Bundle
Service Bundle å·²ç»å¨åé¢è¯´æè¿ï¼ä»¥ä¸æ¸ å为 RemoteBundle ä¸çæä»¶ã
æ¸ å 7. Activator.java
public class Activator implements BundleActivator {
public void start(BundleContext context) throws Exception {
System.out.println("Start to register Remote Service!!");
Dictionary properties = new Hashtable();
properties.put(RemoteOSGiService.R_OSGi_REGISTRATION, Boolean.TRUE); context.registerService(IMathImpl.class.getName(), new MathImpl(), properties);
System.out.println("Register Service successful!!");
}
public void stop(BundleContext context) throws Exception {
System.out.println("Stop Server Successful!!");
}
}
说æï¼å¨ Bundle å¯å¨æ¶ï¼å°ä»£ç Service 注åç» R-OSGiï¼æ³¨æè°ç¨æ¥å£æ¶ï¼éå¡«å ¥ç¹å«çåæ°ç¨æ¥è¾¨è¯è¯¥ Service ä¸ä¾è¿ç¨ R-OSGi è°ç¨ã
æ¸ å 8. IMathImpl.java
public interface IMathImpl {
public int sum(int a, int b);
}
说æï¼R-OSGi éè¦æ¥å£æ¥æä¾ç»è¿ç¨ Customerï¼æä»¥è¿éå®ä¹ä¸ä¸ª sum æ¹æ³çæ¥å£ã
æ¸ å 9. MathImpl.java
package com.ibm.sample.service.calculate.proxy;
import com.ibm.sample.service.calculate.interfaces.IMathImpl;
public class MathImpl implements IMathImpl{
public int sum(int a, int b) {
System.out.println("Run by remote service");
return new com.ibm.sample.service.calculate.MathImpl().sum(a, b) + 1;
}
}
说æï¼å¨ä»£ç Bundle ä¸è°ç¨çæ£ Service æä¾ç sum æ¹æ³ï¼ä¸ºäºé¿å è°ç¨æ··æ·ï¼è¿éå¡«å ¥å ¨é¨çå åãæ¤å¤å¨æ±åæ¶ç¹å°è®²ç»æ +1ï¼ç¨ä»¥å¨ UI ä¸åè¾¨è¿æ¯è¿ç¨è°ç¨çè鿬å°ã
æ¸ å 10. MANIFEST.MF
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: RemoteService
Bundle-SymbolicName: RemoteService
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.ibm.sample.service.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: ch.ethz.iks.r_osgi,
com.ibm.sample.service.calculate,
org.osgi.framework;version="1.3.0"
Bundle-ActivationPolicy: lazy
说æï¼Import çæ£ Service ææä¾çæ¹æ³ã
å¾ 10. å¯å¨è¿ç¨ OSGi åºç¨
å¯å¨åï¼ä¼å¨æ¬å°æå¼é»è®¤ç 9278 端å£çå¬è¿ç¨è¯·æ±ã
å¾ 11. é»è®¤ç 9278 端å£å·²ç»æå¼
æ¬å° OSGi
卿¬å°èï¼å°ä¼å建ä¸ä¸ªå为 LocalService ç Bundleï¼è¿åä¹åå建ç Customer Bundle ä¸èµ·ï¼æ¬å° OSGi å°ä¼å¯å¨å¦ä¸ä¸¤ä¸ª Bundleã
å¾ 12. æ¬å° OSGi å¯å¨ Bundle
Customer Bundle å·²ç»å¨åé¢è¯´æè¿ï¼ä»¥ä¸æ¸ å为 LocalBundle ä¸çæä»¶ã
æ¸ å 11. MathImpl.java
public class MathImpl {
static BundleContext context = Activator.context;
Object obj;
public MathImpl() {
final ServiceReference ref = context
.getServiceReference(RemoteOSGiService.class.getName());
RemoteOSGiService remoteSvc = (RemoteOSGiService) context
.getService(ref);
RemoteServiceReference[] rrefs = null;
try {
remoteSvc.connect(new URI("r-osgi://localhost:9278"));
} catch (RemoteOSGiException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
rrefs = remoteSvc.getRemoteServiceReferences(new URI(
"r-osgi://localhost:9278"),
"com.ibm.sample.service.calculate.interfaces.IMathImpl", null);
if (rrefs != null && rrefs.length > 0) {
obj = remoteSvc.getRemoteService(rrefs[0]);
}
}
public int sum(int a, int b) {
try {
Method m = obj.getClass().getMethod("sum", int.class, int.class);
return Integer.parseInt("" + m.invoke(obj, a, b));
} catch (Exception ex) {
System.out.println(ex);
}
return 0;
}
}
说æï¼
LocalService ä¸éå° Class åä¸è°ç¨æ¹æ³åä¸å Service æä¾çç¸ä¸è´ï¼è¿æ ·å¯ä»¥ä¿è¯ä¸ç¨ä¿®æ¹ Customer ä¸ç代ç ã
MathImpl
æé æ¹æ³éä»
BundleContext
éåå¾
R-OSGi
ç
Service
ï¼å¹¶éè¿å ¶è°ç¨è¿ç¨ç
Service
ï¼å¨è¿éè¿ç¨
Service ç IP æ¯ localhostï¼Port æ¯ 9278ã- sum æ¹æ³ä¸éè¿åå°è°ç¨ä» RemoteService åå¾ç Objectï¼å³ Serviceï¼ä¸ç sum æ¹æ³ï¼æ¥å®æè¿ç¨è°ç¨è¿ç¨ã
æ¸ å 12. MANIFEST.MF
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: LocalService
Bundle-SymbolicName: LocalService
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.ibm.sample.service.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: ch.ethz.iks.r_osgi,
org.osgi.framework;version="1.3.0"
Bundle-ActivationPolicy: lazy
Export-Package: com.ibm.sample.service.calculate
说æï¼Export åºä¾ Customer è°ç¨ç Serviceã
å¾ 13. å¯å¨æ¬å° OSGi åºç¨
å¨ UI ä¸åæ¬¡ä½¿ç¨æ±ååè½
å¾ 14. ç¨æ·ç颿²¡æåå
å¾ 15. ç»æä¸ºå®é ç»æ +1ï¼ç¡®å®ä¸ºè°ç¨è¿ç¨ Service
è³æ¤ï¼æ´ä¸ªå©ç¨ R-OSGi å®ç°çåå¸å¼ OSGi åºç¨ç¨åºå°±å®æäºãå¨è¿ä¸ªä¾åä¸å¹¶æ²¡ææ¹ååæ¥ä¸¤ä¸ª Customer å Service Bundle ç代ç èæ¯ç´æ¥å° R-OSGi 模åå å ¥è¿å»ï¼å¯¹äº Customer æ¥è¯´ä»å¹¶ä¸ç¥éè°ç¨çæ¯æ¬å° OSGi è¿æ¯è¿ç¨ç模åï¼å®åªç®¡å宿ä¾èµç Bundle ååºè¯·æ±ãèå¯¹äº Service æ¥è¯´ä¹ä¸å¨ä¹å°åºè°æ¥æ¶è´¹ä»ï¼èåªç®¡å夿便¥å£è¿åç»æã卿²¡æä»£ç ä¿®æ¹çæ åµä¸å°ä¸¤ä¸ªç¸äºä¾èµç Bundle è§£å¼è¦åå ³ç³»å¹¶å离å°ä¸åç Server ä¸ï¼è¿ç§æ¨¡å¼å¨å®é ä¸ä¹æä¸å®çåé´æä¹ã
æ¬æå æ¯ä»ç»äº OSGi çåºæ¬æ¦å¿µï¼OSGi å¨è®¸å¤ä¼ä¸ç大å项ç®ä¸å¹¿æ³ä½¿ç¨çç忶乿´é²äºä¸äºç³»ç»è¿äºåºå¤§å¸¦æ¥çé®é¢ãæ¥ä¸æ¥ä»ç» R-OSGi è¿ä¸ªå·¥å ·å¯¹äºåå¸å¼ OSGi åºç¨ç¨åºçæ¯æãæåéè¿ä¸ä¸ªå®ä¾è®²è¿°äºå¦ä½å©ç¨ R-OSGi 卿²¡æåå 代ç ä¿®æ¹çæ åµä¸å°ä¸¤ä¸ªç¸äºä¾èµç Bundle è§£å¼è¦åå ³ç³»å¹¶å离å°ä¸åç Server ä¸ï¼æææå°æè¯»è å¦ä½è¿ç¨ R-OSGi æ¥æå»ºåå¸å¼ OSGi çè¿è¡ç¯å¢åå®ä¾ã
为äºå®ç° OSGi åå¸å¼åºç¨ï¼ç®åæä¸¤å¤§éµè¥ï¼Eclipse ECF Vs Apache CXFï¼ECF ç代表为 R-OSGiï¼è D-OSGi 忝 CXF ç代表ãR-OSGi ç¸å¯¹æ¥è¯´å岿´ä¹ ï¼è D-OSGi ä½ä¸ºå°æ¥ç R 4.2 ç RFC119 çå®ç°ï¼ä¹å¼å¾æå¾ ãå ¶æ ¸å¿åçå为å©ç¨ä¸ä¸ªéæçè¿ç¨ RPCï¼å©ç¨ä»£çãåå°ãç½ç»é信以åæå¡åç°å 以å®ç°ãæ¬æä¸æ¶åæ¯è¾ä¸¤å¤§éµè¥çä¼ç¼ºç¹ï¼ä»ä»¬ä¸ºæä»¬å®ç°åå¸å¼ OSGi æä¾äºå¯è½ï¼ä¹æä¸ºäºæªæ¥åå¸å¼ OSGi çå屿¹åå¥ å®äºåºç¡ã
åæåºå¤ï¼ IBMdeveloperWorks