在进行二次开发,特别是开源项目的二次开发中,有那么几点我觉得是非常重要的,第一是在修改之前要先搞清楚这个开源项目如何进行部署、打包和测试,这些东西一般来说比较烦,容易产生问题,而国外开源软件的文档可能不是那么全面,环境和我们也可能不同(一般是linux环境居多);第二是在修改之前,先研究一下别人的源码,看看别人是不是给你提供了一些二次开发的接口,一般都会有一些plugins之类的,可以直接拿过来用;第三也是最重要的,如果不是特别需要,尽量不要直接修改别人的代码,也不要破坏别人的类结构(比如在别人的包下面加类),这样做,以后维护起来比较方便,而且我们也可以继续更新使用官方的新版本。
在Jitsi这个项目的基础上进行二次开发,之前已经研究过它的编译打包,下面我们要研究一下它的架构,首先这个项目是一个基于OSGI的项目,OSGI的结构,简单来说就是一个OSGI加多个Bundle(也可翻译为模块或者插件),因此我们在这个架构上进行二次开发方向比较明确,就是进行OSGI的模块开发;然后我们研究一下源码发现它对于UI开发提供了一些容器和接口,可以方便我们进行GUI开发,并且给出了一个exampleplugin的Bundle,具体大家可以自行查看源码。
在JItsi项目的源码目录下(src)添加包:test.plugin.employeebook包,在这个包下新建一个类:EmployeebookPluginActivator,如下
public class EmployeebookPluginActivator implements BundleActivator{
@Override
public void start(BundleContext arg0) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void stop(BundleContext arg0) throws Exception {
// TODO Auto-generated method stub
}
}
在同样的包下新建一个名为employeebookplugin.manifest.mf的文件,内容如下:
Bundle-Activator: test.plugin.employeebook.EmployeebookPluginActivator
Bundle-Name: EmployeeBook plugin
Bundle-Description: A plugin used to show employee book
Bundle-Vendor:
Bundle-Version: 0.0.1
Import-Package: org.osgi.framework
修改项目根目录下的build.xml文件,添加一个ant target如下:
<target name="bundle-plugin-employeebook" depends="compile">
<jar compress="false" destfile="${bundles.dest}/plugin-employeebook.jar"
manifest="${src}/test/plugin/employeebook/employeebookplugin.manifest.mf">
<zipfileset dir="${dest}/test/plugin/employeebook"
prefix="test/plugin/employeebook" />
</jar>
</target>
然后运行这个target,完成后在项目根目录下的sc-bundles目录下出现plugin-employeebook.jar,然后修改lib目录下的felix.client.run.properties文件,设置felix框架自动加载这个bundle,然后运行整个项目,在选项》插件下找到这个插件,说明插件部署成功了。
public class EmployeebookPluginActivator implements BundleActivator{
@Override
public void start(BundleContext arg0) throws Exception {
// TODO Auto-generated method stub
//在主窗口中加如一个TAB窗口,这个EmployeebookPanel 是一个JPanel
EmployeebookPanel employeePanel = new EmployeebookPanel(Container.CONTAINER_MAIN_TABBED_PANE);
Hashtable<String, String> containerFilter = new Hashtable<String, String>();
containerFilter.put(
Container.CONTAINER_ID,
Container.CONTAINER_MAIN_TABBED_PANE.getID());
arg0.registerService(PluginComponent.class.getName(),employeePanel,containerFilter);
//以上应用了Jitsi的插件UI管理机制,其中Container下有许多常量,代表着不同的容器,
//通过这些容器我们可以方便地把需要的组件添加到菜单栏、状态栏都位置
}
@Override
public void stop(BundleContext arg0) throws Exception {
// TODO Auto-generated method stub
}
}
这一步我们按照OSGI的标准来就可以了,我们运行上面的Ant Target,发现项目sc-bundles目录下多出一个plugin-employeebook.jar文件,然后我们修改lib目录下的felix.client.run.properties文件,加入\ reference:file:sc-bundles/plugin-employeebook.jar,重启Jitsi项目,我们会发现插件被自动加载进来了。