Opendaylight学习及开发初级教程 .pdf
-
资源ID:34233307
资源大小:1.86MB
全文页数:46页
- 资源格式: PDF
下载积分:4.3金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
Opendaylight学习及开发初级教程 .pdf
Opendaylight 学习文档qq 群#北邮-天依名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 46 页 - - - - - - - - - 目录1.概述 . 31.1 Opendaylight 简介 . 31.2 本文档组织结构 . 72.感受 Opendaylight . 72.1 环境搭建 . 72.2 获取代码 . 92.3 安装 mininet . 112.4 controller 使用及功能介绍. 112.5 Openflowplugin功能及使用方法. 142.6 Hydrogen . 163 Maven 和 OSGI基础 . 163.1 Maven . 163.2 OSGI . 204 使用 IDE . 304.1 使用 Eclipse . 314.1.1 导入 controller 项目 . 314.2 使用 Intellij idea . 385Controller代码分析 . 395.1 代码目录 . 405.2 收发包过程简介(packet service ) . 416 Opendaylight重要技术及文档 . 44名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 46 页 - - - - - - - - - 1. 概述1.1 Opendaylight简介Opendaylight(Opendaylight 官网)是 Linux 基金会的一个合作项目。目前,包括十二个项目,每一个项目都有自己的代码库(Opendaylight 项目列表 )。这些项目中与 openflow 相关的项目的有controller、openflowjava 和 openflowplugin,目前,controller 仅支持 openflow 1.0, openflowplugin 是一个单独的项目,将来它的 core部分要集成到 controller 中,使 controller 支持 openflow 1.3 及以上的版本。Opendaylight的厂商成员分为铂金成员,金牌成员和银牌成员。图 1 Opendaylight 阵营Opendaylight controller 使用 java编写,运行在 JVM 上,理论上来说可以部署到任何支持JAVA 的平台上,但是其 官网文档 推荐的最佳运行环境为最新的Linux(Ubuntu 12.04+)及 JVM 1.7+。OpenDaylight Controller 提供了一个模块化的开放 SDN 控制器,它提供了开放的北向API(开放给应用的接口) ,同时南向支持多种包括 openflow 在内的多种 SDN 协议。底层支持混合模式的交换机和经典的 Openflow 交换机。Open Daylight Controller 在设计的时候遵循了六个基本的架构原则(以下来名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 46 页 - - - - - - - - - 自 opendaylight官方文档):运行时模块化和扩展化( Runtime Modularity and Extensibility ) :支持在控制器运行时进行服务的安装、删除和更新。多协议的南向支持( Multiprotocol Southbound) :南向支持多种协议。服务抽象层(Service Abstraction Layer) :南向多种协议对上提供统一的北向服务接口。MD-SAL (Model Driven Service Abstraction Layer)是opendaylight 的一个主要 feature。开放的可扩展北向API(Open Extensible Northbound API ) :提供可扩展的应用 API,通过 REST 或者函数调用方式。两者提供的功能要一致。支持多租户、切片( Support for Multitenancy/Slicing) :允许网络在逻辑上(或物理上)划分成不同的切片或租户。 控制器的部分功能和模块可以管理指定切片。控制器根据所管理的分片来呈现不同的控制观测面。一致性聚合( Consistent Clustering) :提供细粒度复制的聚合和确保网络一致性的横向扩展( scale-out ) 。Opendaylight controller 的架构框架:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 46 页 - - - - - - - - - 图 2 Opendaylight controller 架构如图 2 所示, 南向通过 plugin 的方式来支持多种协议, 包括 OpenFlow1.0、1.3,BGP-LS 等。这些模块被动态挂载到服务抽象层(SAL) ,SAL 为上层提供服务,将来自上层的调用封装为适合底层网络设备的协议格式。控制器需要获取底层设备功能、可达性等方面的信息,这些信息被存放在拓扑管理器(Topology Manager)中。其他的组件,包括ARP handler、Host Tracker、Device Manager和 Switch Manager,则为 Topology Manager生成拓扑数据。控制器为应用(App) 提供开放的北向API。 支持 OSGI 框架和双向的REST 接口。 OSGI 框架提供给与控制器运行在同一地址空间的应用,而 REST API 则提供给运行在不同地址空间的应用。所有的逻辑和算法都运行在应用中。控制器自带了GUI,这个 GUI 使用了跟应用同样的北向API,这些北向API 也可以被其他的应用调用。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 46 页 - - - - - - - - - Opendaylight的 openflowplugin 和 openflowjava 项目的目标是支持openflow 1.3 及以上的协议,由于openflow 协议设计时并没有考虑后向兼容性(例如openflow 1.0 和 openflow 1.3 的连接建立发生了很大的变化) , Openflow 1.3 plugin采用和 Openflow 1.0 完全不同的设计。 集成到 controller 的 openflow 1.0 plugin 是由 openflow plugin 和 openflowj 两部分实现,其中 openflowj 是 openflow 1.0 消息的静态库,它被 openflow 1.0 plugin 依赖,。Openflow 1.3 plugin 中的 openflowjava没有了 Openflow 1.3 的消息库( 使用了 YANG,支持 Openflow 1.3 以上的版本 ? ? ? ) 还包 括 了 连 接 建 立 和协 议编 解 码 部 分 , OpenflowPlugin 依 赖Openflowjava 实现消息处理等功能。 Openflowjava 和 OpenflowPlugin 设计框图如下:图 3 Openflowplugin 和 Openflowjava 设计框图如图 3 所示,左侧为 openflowjava 的功能框图, 右侧为 Openflowplugin 的框图。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 46 页 - - - - - - - - - 1.2 本文档组织结构本文档关注与 openflow 相关的 controller, openflowjava 和 openflowplugin 三个项目,重点分析controller。本文本着由浅入深的原则,首先介绍如何获取相关项目代码,如何编译,运行;其次介绍OSGI 框架和 maven 的一些基础概念,与此同时,分析opendaylight controller 的代码结构,接着介绍如何将controller导入到 Eclipse和 Intellij idea 中(之所以把这步放在OSGI 和 maven介绍之后,是因为导入工程到IDE 的过程需要对 OSGI 和 maven有一些了解),分析下这两种 IDE 在编译调试中各自的优缺点;然后是代码的分析;最后列举opendaylight的重要技术及文档。Opendaylight有很多重要的技术需要了解, 每种技术都需要花一段时间研究,例如 OSGI 框架的使用, OSGI 服务的注册和调度, maven工程中 bundle的编写方法, sal,YANG,config,等。由于时间精力的限制,本文在最后简单分析了controller 收发包过程中 openflow plugin, SAL 和上层应用间的关系。文章中对不太明确和有疑问的地方采用红色字体加问号来标识。2. 感受 Opendaylight 这里的 Opendaylight 指的是 controller,openflowjava 和 openflowplugin,它们使用不同的代码库,但编译运行环境相同。2.1 环境搭建需要的环境如下:1)Ubuntu 12.04 32bit 2)JVM 1.7+ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 46 页 - - - - - - - - - 3)Maven 3.04+ 对于第 2)和 3)需说明的是,最好先配臵java 环境再安装 maven,因为我这边的情况是我本来先安装maven, 挺费时间的(如果网速慢), 后来删除 jdk-6,maven也被删掉了Step1: 配臵 java 环境执行 java version查看使用的 java版本这个版本的 ubuntu装的应该是 jdk 1.6 执行 apt-get remove openjdk-6-jre-lib openjdk-6-jre-headless 删除 jdk 1.6 相关的东西注意:执行这个命令的时候,需要观察下remove 过程,会发现它会自动安装 java jre 1.7 的东西,但是不要认为就不需要装jdk 1.7 了,因为 ubuntu 默认安装的东西是不全的, 至少我安装的过程中遇到了问题。 确认是否 java jdk是否安装全面的方法是,查看jdk 的安装目录是否完全flightflight-virtual-machine:$ ls /usr/lib/jvm/java-7-openjdk-i386/lib/ ct.sym dt.jar ir.idl jconsole.jar jexec orb.idl sa-jdi.jar tools.jar 以上这个 “ tools.jar”是必不可少的, 因为 maven编译的时候对它有依赖。 如果发现 java-7-openjdk-i386 下没有 lib 文件夹,那么继续执行下一步执行 sudo apt-get -y install openjdk-7-jdk 注意:依然要看一下安装过程,如果发现似乎什么都装不上,那么请执行apt-get remove openjdk-7-jre-lib openjdk-7-jre-headless 删除 ubuntu给你默认安名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 46 页 - - - - - - - - - 装的东西,再执行sudo apt-get -y install openjdk-7-jdk,之后再按上步所述查看 jdk 是否安装完全,一般没有问题了。修改 java环境变量Vim /etc/profile 在其末尾添加如下,并保存:export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH 完成以下修改后,需重启虚拟机或使用命令source /etc/profile使配臵生效Step2: 安装 maven:sudo apt-get install maven 备注:使用 mvn v 可以查看当前系统中maven的版本,可以安装前和安装后看一下编译时,为避免出现“Out of memory error - java.lang.OutOfMemoryError: PermGen space: ”错误,可加入如下环境变量Home目录下执行: vim .bashrc在其结尾添加如下一行: export MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=256m 然后 logout ubuntu再 login 使配臵生效2.2 获取代码Controller, openflowplugin 和 openflowjava的代码都可以匿名 git clone到本地。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 46 页 - - - - - - - - - 下载 controller:git clone https:/git.opendaylight.org/gerrit/p/controller.git下载 openflowplugin:git clone https:/git.opendaylight.org/gerrit/p/openflowplugin.git下载 openflowjava:git clone https:/git.opendaylight.org/gerrit/p/openflowjava.git下载完毕后,会在当前目录下会生成controller、 openflowplugin 和 openflowjava三个目录。因为 openflowplugin 依赖 openflowjava, 在编译 openflowplugin 时会同时编译openflowjava 的相关 bundle,因此 openflowjava 是不需要单独编译的,下载下它的目的是为了后续分析它的代码结构。需说明的是, openflowplugin 目前是一个单独的项目,它包含基本的controller 代码,所以它是可以单独运行的,只是没有controller 那样可以直观的从浏览器中看到和使用它的功能。Openflowplugin 如何运行使用将在后面介绍。编译运行编译:Controller: cd controller/opendaylight/distribution/opendaylight mvn clean install Openflowplugin: cd opendaylight/openflowplugin/distribution/base mvn clean install 为避免编译过程中test的编译错误,可使用mvn clean install DskipTests跳名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 46 页 - - - - - - - - - 过测试执行:Controller: cd controller/opendaylight/distribution/opendaylight/target/distribution.opendaylight-OSGIpackage/opendaylight ./run.sh Openflowplugin: cdopenflowplugin/distribution/base/target/distributions-openflowplugin-base-0.0.1-SNAPSHOT-OSGIpackage/opendaylight ./run.sh 2.3 安装 mininet 我们使用 mininet 与 opendaylight controller 连接,我们使用的 mininet 的版本为mininet-of-1.3 ,既支持openflow1.0 也支持openflow1.3 协议,下载地址为mininet-of-1.3。启动 mininet,使用 ifconfig 查看网络配臵,配臵mininet 的网络环境使之可以与 opendaylight controller 之间的连通,配臵完成后,从controller 和 mininet 两边分别 ping 一下。2.4 controller使用及功能介绍本节将通过 opendaylight controller与 mininet 连接, 演示 controller 的使用。Controller 支持的是 openflow 1.0 因此我们看到 controller 与 mininet 协商的版本时名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 46 页 - - - - - - - - - 1.0 版本。2.4.1 连接 controller和 mininet Step1: 启动 controller 执行./run.sh,等待几分钟,打开浏览器,输入:http:/localhost:8080,进入opendaylight的登陆页面,用户名和密码都是admin 图 4 opendaylight controller 登陆页面Step2: 启动 mininet 连接 controller Mininet 连接 controller 的命令为 mn,启动 mininet,执行 which mn,可以看到 mn 已经被安装到 /usr/local/bin 下。使用 mn help可以查看 mn 命令的帮助,mininet 命令的详见 http:/mininet.org/walkthrough/。本例中, mininet连接 controller 的命令为 (使用 tree类型拓扑, remote controller) :sudo mn -controller=remote,ip=192.168.1.29 -topo tree,3 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 46 页 - - - - - - - - - 2.4.2 controller功能介绍Mininet 连接上 controller 后,会在首页形成拓扑图,需要注意是拓扑图开始只会显示交换机不会显示主机,这是由链路发现协议(LLDP) 来决定的,当主机发起流量时,相关主机才会在拓扑图中显示。图 5 mininet 连接上 controller如上图控制器主要包含的功能有:设备、静态流表及统计。Devices 功能,可以实现网络节点的学习(Nodes learned) ,连接管理( connection Manager) , 网络 拓 扑 图 、 静 态 路 由 配 臵 ( Static Route Confiuration ) 、子网网关配臵(Sub Gateway Configu )及SPAN Port Configuration。其中 Nodes learned功能,可以发现网络设备,得到对应的网络节点(网络设备,交换机)的 Id(Node ID)及对应交换机的端口信息; Connection 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 46 页 - - - - - - - - - Manager可以对这些网络设备进行管理, 可以实现网络设备的添加和删除;Static Route Configuration 可以手动添加或删除静态路由,进行路由配臵管理;Subnet Gateway Configuration可以手动实现子网网关的添加和删除配臵,并可以实现只针对交换机具体端口的网关的配臵,controller 的三层转发功能必须配臵网关。SPAN Port Configuration,即交换机分析器的端口配臵。SPAN,全称为Switched Port Analyzer,直译为交换端口分析器。是一种交换机的端口镜像技术。作用主要是为了给某种网络分析器提供网络数据流,SPAN 并不会影响源端口的数据交换, 它只是将源端口发送或接收的数据包副本发送到监控端口。2.5 Openflowplugin功能及使用方法如 2.3 所述, openflowplugin 也可以单独连 Mininet,但不能像 controller 那样通过浏览器直接查看和使用其提供的功能。Openflowplugin 获取当前交换机的连接状态以及下发流表都需要手动发送http 的 post/get请求。使用的工具是google的 chromium浏览器 (windows 上的 chrome浏览器) 所提供的 “postman rest client ”插件。在 ubuntu 中通过包管理中心可以下载chromium Web Browser,如下图所示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 46 页 - - - - - - - - - 图 6 下载 chromium 下载安装完 chromium 后,使用 Tools-Extensions进入 chromium 的扩展下载页面,搜索 postman,选择 postman rest api,点击“下载”,下载前需要注册Google账号。下载完成后,可在如下界面看到postman已经安装好。图 7 安装好 postman 安装完成后,即可按照User_Guide#Tutorial_.2F_How-To中的 End to End xxx(xxx 指 Inventory、Flow、Meter、Group)进行相关的测试了,需要说明的是:下发流表 /Group 表/Meter 表的 xml 例子在 test-script/目录下,以 f 开头的是有关流表的,以 g 开头的是 Group表的,以 M 开头是 Meter 表相关的自行下载 Openflowplugin 代码并编译时,还可以在OSGI 的命令行下使用诸如addMDFlow之类的命令下发上述表项,详见名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 46 页 - - - - - - - - - OpenDaylight_OpenFlow_Plugin:Test_Provider , Hydrogen 并不支持这些命令,因为 Hydrogen没有 Test Provider bundle 使用 postman时,要注意 url 一行的最左边一定不要有空格否则会出错;下发流表时一定要使用Basic Auth而非 Normal,如下图:图 8 2.6 Hydrogen Hydrogen我用的是 base版,具体如何下载,群里有文档,我就不赘述了,需说明的是 Hydrogen既支持 openflow 1.0又支持 openflow1.3, 若要使用 openflow 1.0 直接执行 ./run.sh,若使用 openflow 1.3,使用 ./run.sh of13. 3 Maven 和 OSGI 基础前面介绍编译 opendaylight 时使 用的是 maven,概述中提到 opendaylight controller 使用的是OSGI 框架,在分析代码前, 我们需要弄清楚Maven 和 OSGI的一些基础知识,否则controller 那么多的代码将无从下手,在介绍这些基础知识时,我会结合 controller 项目代码,给出自己的理解。3.1 Maven 本部分有很多都摘自一篇maven的书。Maven 是一个优秀的构建工具, 能够帮我们自动化构建过程, 从清理、编译、测试到生成报告,再到打包和部署。Maven 是跨平台的,这意味着无论是在Windows 上,还是在 Linux 或者 Mac 上,都可以使用同样的命令。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 46 页 - - - - - - - - - 在不了解 maven 时,你可以想象它完成的是像make 或 ant 那样的功能。就像 Make 的 makefile, Ant 的 build.xml 一样,Maven 项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。打开opendaylight controller 代码的任意一个目录,例如 controller/arphandler 目录,就可以看到pom.xml,稍后,简单分析下 pom.xml,网上也有很多相关的文章。使用 Ubuntu 的 apt-get install 安装 maven 时, maven 的安装目录一般在/usr/share/maven ,Maven 的安装目录被称之为M2_HOME( 我在试验时,环境变量没有设臵这一项,所以不确定若不设臵这一环境变量有什么后果)。以下是maven安装目录的分析:Bin:该目录包含了mvn 运行的脚本,这些脚本用来配臵Java 命令,准备好 classpath 和相关的Java 系统属性,然后执行Java命令。其中 mvn 是基于 UNIX 平台的 shell 脚本,mvn.bat 是基于 Windows 平台的 bat 脚本。在命令行输入任何一条mvn 命令时,实际上就是在调用这些脚本。该目录还包含了mvnDebug 和 mvnDebug.bat 两个文件,同样,前者是UNIX 平台的shell 脚本,后者是windows 的 bat 脚本。那么mvn 和mvnDebug 有什么区别和关系呢?打开文件我们就可以看到,两者基本是一样的,只是 mvnDebug多了一条MAVEN_DEBUG_OPTS 配臵,作用就是在运行Maven 时开启 debug,以便调试Maven 本身。此外,该目录还包含 m2.conf 文件。Boot 目录: 据说普通用户不需要关心这个目录。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 46 页 - - - - - - - - - Conf:该目录包含了一个非常重要的文件settings.xml。直接修改该文件,就能在机器上全局地定制Maven 的行为。一般情况下,我们更偏向于复制该文件至home 目录下的 .m2/目录下(这里 表示用户目录),然后修改该文件, 在用户范围定制Maven的行为。 /.m2是默认的 maven本地仓库,我们可以通过加入环境变量(export MAVEN_OPTS=-Dmaven.repo.local=/path/to/repository)来 修 改 本地 仓库的路径。 /.m2 的作用在下面详细介绍。关于 setting.xml 对于 maven 应该是一个很重要的文件,导入工程到 Eclipse 和 Intellij idea 两个 IDE 中时都需要将 setting.xml 的位臵设臵正确。Lib:该目录包含了所有Maven 运行时需要的Java 类库。./m2/repository目录为 maven的本地仓库,观察mvn clean install 执行时,会发现有很多 download 的过程, download 下的内容即保存到了repository 下的对应目录下了。从目前的经验来看,安装到这个仓库的内容包括执行mvn命令时需要的或pom.xml 所依赖的各种插件。 按照 maven 的一些资料所述,一个 maven构件若想能被其他maven项目使用,则需要将此构建安装到本地仓库中,但是我还不确定这一点在opendaylight controller 上是怎么表现的,因为我查看 repository 中没有 controller 各个 bundle 的 jar,也许跟使用的OSGI框架有关。maven的主要命令包括:mvn clean compile、 mvn clean test 、 mvn clean package 、mvn clean install。Clean是清空, compile 是编译, test是编译 java 的 test代码,package是打包,打包默认存放路径是target/目录, install 是将打包出的 .jar 安装名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 46 页 - - - - - - - - - 到 maven 的本地仓库中,默认为home 目录下的 .m2/repository。根据我们使用mvn clean install 的经验, install 之前,会先执行clean,compile 和 package ,执行这些命令时实际上我们是在执行相应的maven插件。下面以 controller/arphandler/为例来介绍下 pom.xml 的含义。pom.xml 的开头的最重要的是“groupId” , “artifactId” 和“version” 三行。这三个元素定义了一个项目基本的坐标,在 Maven 的世界,任何的 jar、 pom或者 war 都是以基于这些基本的坐标进行区分的。GroupId 定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联,譬如你在googlecode 上建立了一个名为myapp 的项目,那么 groupId 就应该是com.googlecode.myapp ,如果你的公司是mycom,有一个项目为myapp,那么groupId 就应该是com.mycom.myapp。ArtifactId 定义了当前 Maven 项目在组中唯一的ID。顾名思义, version 指定了项目当前的版本随着项目的发展,version 会不断更新。“packaging ” 指的是打包方式,bundle指打包成 bundle, pom指不打包。“build”是跟构建相关的设臵。 “plugin”中的 maven-bundle-plugin 指 arphandler 要通过maven的 maven-bundle-plugin插件编译成 OSGI 的 bundle。 “plugin”里的内容将在介绍 OSGI 时再介绍“dependencies ” 即依赖关系,但我没研究过依赖的机制 (如何确定依赖 )。最后要提的是 maven 的一个重要概念, archetype 。一般 maven 项目的根目录下会创建 pom.xml,src/main/java 中为项目主代码, src/test/java为执行单元测试的代码,有些工程还会有resource目录,以上目录都统称为项目骨架。每件一个 maven 项目都要建立那些目录,为了尽量减少重复工作,maven 提供了 mvn 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 46 页 - - - - - - - - - archetype:generate 命令(maven 3.0可以直接执行此命令) ,其中“ archetype ”指我们使用的是maven-archetype-plugin 插件, “generate ”指我们的目标是产生项目骨架。执行mvn archetype:generate命令后,我们可以自己选择希望用的archetype ,输入我们要创建项目的groupId、artifactId、version、以及包名package 并确认, Archetype 插件将根据我们提供的信息创建项目骨架,因此archetype类似于模板的概念。在opendaylight controller 中使用的 maven archetyp为 odl maven archetypes ,Controller 代码中有一个对应的archetypes目录,其官网对 archetype的介绍为“ A maven archetype to create a yang model project that will generate java code from .yang files ” , 我认为研究这个archetype关系到我们将来如何在 opendaylight写应用,因此很重要。在下一节,我们还要结合opendaylight controller 的代码结构,介绍maven的两个插件,maven-bundle-plugin和 maven-assembly-plugin 。 它们与 OSGI bundle的编译,打包部署相关。3.2 OSGI OSGI框架的实现有多种,Opendaylight使用的是 equinox。 Equinox是 Eclipse 所使用的OSGI 框架, Eclipse 强大的插件体系就是构建在OSGI bundles 的基础之上。本节我们将介绍 OSGI 框架的运行方法 (CLI 下)以及 OSGI bundle创建及部署。由于 OSGI 框架的运行离不开bundle 的概念,所以我们首先展示bundle是什么,如何开发bundle,然后介绍OSGI 框架的搭建和运行,最后结合opendaylight controller 代码介绍 bundle 在 OSGI 框架的打包和部署名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 46 页 - - - - - - - - - 3.2.1 基于 OSGI 开发的一个例子什么是bundle? 我现在的理解和表述也许有差池,但是从网上的例子及opendaylight contro