我们一直在使用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