我們一直在使用OSGI和Jboss 7.0.1,並且有多個支持我們應用程序的bundle。我們正在嘗試調整Major.Minor.Micro的版本控制策略以適應接口+服務實現+基於消費者的模式,但似乎我們的策略可能並不正確。什麼是BKM部署OSGI捆綁包有新的變化?
當我們碰到api和服務的次要版本時,消費者無法使用新服務而無需進行軟件包刷新。
下面是用例。
包com.helloworld.api從束的Helloworld API(接口束)
public interface IHelloService {
public void sayHello(String abc);
}
爲的Helloworld API Menifest文件
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Helloworld API
Bundle-SymbolicName: exp1.com.helloworld.api
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.helloworld.internal.Activator
Bundle-Vendor: ABC
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.3.0",
org.osgi.util.tracker;version="1.4.0"
Bundle-ClassPath: .
Export-Package: com.helloworld.api;version="1.0.0"
出口與1.0.0版本從開始實施HelloServiceImpl來自包Helloworldservice
public class HelloServiceImpl implements IHelloService {
@Override
public void sayHello(String abc) {
System.out.println(" \n\n ~~~~~~~~~ "+abc+" ~~~~~~~~~ " + " \n\n");
}
}
Menifest文件的HelloWorldService
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Helloworldservice
Bundle-SymbolicName: exp1.com.helloworld.service
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.helloworldservice.internal.Activator
Bundle-Vendor: ABC
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: com.helloworld.api;version="1.0.0",
org.osgi.framework;version="1.3.0"
Bundle-ClassPath:
從束消費者服務(使用服務跟蹤器或谷歌吉斯方法)由消費者消耗。它一直呼籲sayHello循環。對於消費者服務
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Consumer Service
Bundle-SymbolicName: exp1.com.consumer
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.consumer.internal.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: com.helloworld.api;version="1.0.0",
org.osgi.framework;version="1.3.0",
org.osgi.util.tracker;version="1.4.0"
HelloWorldServiceProxy.getInstance().getHelloWorldService().sayHello("abc " + "Index" + i);
Menifest文件之後,我們做出修改API,並添加新的方法。這導致將次要版本升級到1.1.0。爲了支持這一點,我們實施了新的服務方法,但期望消費者不受影響。
包com.helloworld.api從束的Helloworld API導出的與版本1.1.0
public interface IHelloService {
public void sayHello(String abc);
public void sayHello(String abc, String def, int a);
}
Menifest文件爲的Helloworld API
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Helloworld API
Bundle-SymbolicName: exp1.com.helloworld.api
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.helloworld.internal.Activator
Bundle-Vendor: ABC
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.3.0",
org.osgi.util.tracker;version="1.4.0"
Bundle-ClassPath: .
Export-Package: helloworld.api;version="1.1.0"
通過HelloServiceImpl實施來自包Helloworldservice
public class HelloServiceImpl implements IHelloService {
@Override
public void sayHello(String abc) {
System.out.println(" \n\n ~~~~~~~~~ "+abc+" ~~~~~~~~~ " + " \n\n");
}
@Override
public void sayHelloNew(String abc, String def, int a) {
System.out.println(" \n\n ~~~~~~~~~ "+abc+" NEW METHOD ### WITH CHANGE ### ~~~~~~~~~ " + abc +" " + def +" \n\n");
}
}
Menifest文件
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Helloworldservice
Bundle-SymbolicName: exp1.com.helloworld.service
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.helloworldservice.internal.Activator
Bundle-Vendor: ABC
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: com.helloworld.api;version="1.1.0",
org.osgi.framework;version="1.3.0"
Bundle-ClassPath:
不過,現在當我們部署的HelloWorld阿比HelloWorld服務捆綁,消費者包是無法開始使用與包1.1.0導出的新服務。我們不得不刷新消費者包以使其工作。
我們在這裏做錯了什麼?
到目前爲止,我們一直在部署沒有任何版本的新捆綁包(默認爲0.0.0)。使用相同軟件包修訂部署新軟件包對於微小更改工作良好,但在我們從Jboss執行全局軟件包刷新之前,任何方法簽名更改或新方法使用都會導致NoSuchMethod異常。這就是我們決定使用Jboss版本策略的原因。
BKM是什麼意思? –
最好的已知方法:) – Manan