如何在eclipse中基于maven创建osgi的bundle

本文详细介绍如何使用Maven创建项目结构,配置OSGi Bundle,并通过Eclipse进行安装与运行。涉及环境搭建、依赖管理、插件配置及激活器类编写。

一、环境准备

1、下载并解压eclipse

 

2、下载安装jdk,并配置环境变量

打开系统属性面板(桌面上右键单击“我的电脑”→“属性”),点击高级系统设置,再点击环境变量,在系统变量中新建一个变量,变量名:JAVA_HOME,变量值:C:\Program Files\Java\jdk1.6.0_10——确定。然后编辑path变量,在最前面添加%JAVA_HOME%\bin;即可。

注意:C:\Program Files\Java\jdk1.6.0_10为jdk的具体安装路径。

 

验证jdk安装及环境变量的配置:

开始——运行中输入cmd进入dos界面

C:\Users\您的电脑用户名>echo %JAVA_HOME%

C:\Users\您的电脑用户名>java –version

信息正确即可。

 

3、下载maven安装文件,并配置环境变量

下载:网址http://maven.apache.org/download.html,下载apache-maven-3.0-bin.zip。

 

本地安装: 将安装文件解压到你指定的目录中,如:D:\bin,那么Maven安装目录就是D:\bin\apache-maven-3.0

 

设置环境变量:

将Maven安装配置到操作系统环境中。

打开系统属性面板(桌面上右键单击“我的电脑”→“属性”),点击高级系统设置,再点击环境变量,在系统变量中新建一个变量,变量名为M2_HOME,变量值为Maven的安装目录D:\bin\apache-maven-3.0。点击确定,接着在系统变量中找到一个名为Path的变量,在变量值的末尾加上%M2_HOME%\bin;,注意多个值之间需要有分号隔开,然后点击确定。至此,环境变量设置完成,

 

运行如下命令检查Maven的安装情况:

C:\Users\Juven Xu>echo %M2_HOME%

C:\Users\Juven Xu>mvn -v

 

4、在eclipse中安装maven插件。

如果IDE不是eclipse而是STS,则本步可以跳过,因为STS中已经继承了maven插件。

maven插件的安装是通过eclipse的Help菜单下的Install New Software,然后在打开的窗口中点击Work with右边的“Add”按钮,在弹出的"Add Repository"窗口中再输入Name(m2eclipse),Location中输入maven插件的网址:http://m2eclipse.sonatype.org/sites/m2e

在eclipse中安装maven的附加插件,步骤与上面相同

网址:http://m2eclipse.sonatype.org/sites/m2e-extras

 

5、安装PAX Cursor插件。该插件装完后在eclipse中run configuration中,选择osgi Framework后会出现Pax Runner页面,在该页面中选择要运行的osgi bundle的pom文件来执行run osgi bundle。

网址:http://www.ops4j.org/pax/eclipse/update/

 

二、建maven bundle,并将其转化成osgi bundle运行。(以一个简单的helloworld为例)

1、新建项目父bundle。

a)         在eclipe中new——Project——Maven——Maven Project——Next

 

勾选Create a simple project——next

 

在New Maven Project窗口中输入父bundle对应的gav(即Group Id、Artifact Id、Version)以及Packaging(注意父bundle一定要选pom,子bundle可以选maven plugin)

点击Finish。

b)         新建项目子bundle。

步骤与新建父bundle相同,不同的是New Maven Project中的各项配置值不同。

Group Id相同,这样父与子才能在同一个group中。

Artifact Id不同(父和任何一个子bundle的该值都必须唯一,因此不同)

Version相同

Packaging不同(子bundle的Packaging可以是maven plugin或jar、war等。建完之后会在pom文件中统一修改为bundle以将maven bundle转化为osgi bundle)

c)         在父bundle的pom文件中配置子bundle

打开父bundle的pom.xml文件,在project对之间,最好在父bundle的pav等配置之下添加所有子bundle与父bundle的相对路径。如

<modules>

 <module>../projectname.intf.manageintf</module>

</modules>

其中projectname.intf.manageintf也是子bundle的Artifact Id

 

父bundle的整个pom.xml文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.companyname.projectname</groupId>

  <artifactId>projectname</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>pom</packaging>

  <name>ProjectName</name>

 

  <modules>

       <module>../projectname.intf.manageintf</module>

  </modules>

 

</project>

d)         将子bundle由maven bundle转化成osgi bundle

Ø  在子bundle的pom.xml文件中添加依赖

<dependencies>

                   <dependency>

                            <groupId>org.apache.felix</groupId>

                            <artifactId>org.osgi.core</artifactId>

                            <version>1.0.0</version>

                   </dependency>

         </dependencies>

Ø  在子bundle的pom.xml文件中配置Group Id为org.apache.felix,Artifact Id为maven-bundle-plugin的plugin,并制定bundle的Bundle-Activator。同时修改子bundle的packaging值为bundle。

 

子bundle的整个pom.xml文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

         <modelVersion>4.0.0</modelVersion>

         <parent>

                   <artifactId>projectname</artifactId>

                   <groupId>com.companyname.projectname</groupId>

                   <version>0.0.1-SNAPSHOT</version>

         </parent>

         <groupId>com.companyname.projectname</groupId>

         <artifactId>projectname.intf.manageintf</artifactId>

         <version>0.0.1-SNAPSHOT</version>

         <packaging>bundle</packaging>

         <name>ProjectName Intf ManageIntf</name>

 

         <build>

                   <plugins>

                            <plugin>

                                     <groupId>org.apache.felix</groupId>

                                     <artifactId>maven-bundle-plugin</artifactId>

                                     <extensions>true</extensions>

                                     <configuration>

                                               <instructions>

                                                        <Bundle-Activator>com.companyname.projectname.intf.manageintf.activator.Activator</Bundle-Activator>

                                               </instructions>

                                     </configuration>

                            </plugin>

                   </plugins>

         </build>

 

         <dependencies>

                   <dependency>

                            <groupId>org.apache.felix</groupId>

                            <artifactId>org.osgi.core</artifactId>

                            <version>1.0.0</version>

                   </dependency>

         </dependencies>

</project>

注意:pom的build属性中  <extensions>true</extensions>千万不能落!!!
否则eclipse会报错:Project build error:Unknown package:bundle
 

Ø  新建Activator类

按照子bundl epom文件指定的Bundle-Activator建立对应的包和Activator类。如本例中应该在子bundle的src/main/jave路径下,新建一个包名为com.companyname.projectname.intf.manageintf.activator的类Activator.java。

该类必须实现BundleActivator接口,该接口所在包名为org.osgi.framework.BundleActivator,接口中有两个方法,分别用于启动和停止该bundle时调用。

public void start(BundleContext arg0) throws Exception;

public void stop(BundleContext arg0) throws Exception;

 

Activator类具体如下:

package com.companyname.projectname.intf.manageintf.activator;

 

import org.osgi.framework.BundleActivator;

import org.osgi.framework.BundleContext;

 

public class Activator implements BundleActivator{

 

         @Override

         public void start(BundleContext arg0) throws Exception {

                   System.out.println("start projectname.intf.manageintf bundle!");

         }

 

         @Override

         public void stop(BundleContext arg0) throws Exception {

                   System.out.println("stop projectname.intf.manageintf bundle!");

         }

 

}

e)         Maven install

eclipse——run Configurations——Maven Building——右键new——修改name为projectname_install,在Main页中Base directory下点击“Browse Workspace”,选择父bunde的Artifact Id,如本例为projectname,点击ok。然后在Goals中输入clean install,其本质就是执行maven clean命令和maven install命令。

如果eclipse没有配置java vm的最大内存,那么需要在JRE页面中的VM arguments中输入-Xmx1000m,以免出现堆栈溢出错误。值1000可根据个人电脑内存大小进行配置。

回到Main页面,点击Apply将该配置保存。然后点击Run,就可以执行以上命令将父bundle中配置的所有子bundle都统一执行clean和install命令了。

执行结果如果显示所有bundle都SUCCESS即正确。

[INFO] Reactor Summary:

[INFO]

[INFO] ProjectName ....................................... SUCCESS [0.251s]

[INFO] ProjectName Intf ManageIntf ....................... SUCCESS [2.560s]

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 3.826s

[INFO] Finished at: Sun Apr 15 10:13:10 CST 2012

[INFO] Final Memory: 5M/10M

注意:!!!!

第一次执行过程中可能出错,无法找到父bundle等的错误。解决办法为:

1、  先将父bundle的pom文件中的子bundle去掉,即注释

<modules>

                <module>../projectname.intf.manageintf</module>

                  </modules>

         然后右键父bundle,选择run as——Maven install,父bundle install成功后

再右键子bundle,选择run as——Maven install,子bundle install成功后

再将父bundle中被注释掉的子bundle信息

<modules>

                <module>../projectname.intf.manageintf</module>

                  </modules>

取消注释,然后在run configurations中执行之前的projectname_install,如果显示父bundle和各个子bundle都install成功,即install成功。

f)          osgi bundle run

eclipse——run Configurations——Osgi Framework——右键new——修改name为osgi_run,在Pax Runner页中点击Add Pom,在打开的窗口中选择本地父bundle的路径下pom.xml文件。然后依次选择各个子bundle的pom文件

在Bundle页中取消所有Bundles的选择,在Framwork中选择Equinox 3.5.0 via Pax Runner,点击Apply,保存该run配置,然后点击Run运行osgi bundle

运行后eclipse的Console中显示

在Console中输入ss回车,即可看到所有bundle的运行情况,如

如果要停某个bundle,只需要输入stop bundle对应的id即可。如本例中停子模块的bundle,则只要输入stop 1即可,要启动已停止的bundle则输入start bundle对应的id即可。

同理可以动态卸载和安装bundle

卸载为uninstall bundle对应的id

安装为install file:///要安装的bundle对应的target文件夹下的jar包的完整本地路径,如本例中安装子bundle即为

installfile:///D:\configCode\configurationmanagement\projectname.intf.manageintf\target\projectname.intf.manageintf-0.0.1-SNAPSHOT.jar

新安装的bundle并没有自动启动,需要start 对应的bundle id才行,如本例

至此,maven bundle转化成osig bundle讲解结束!

其他osgi相关的高级配置和spring dm等的使用参加其他文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值