您的位置:首页 > 编程语言 > Java开发

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

2014-05-05 11:17 405 查看
一、环境准备

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>

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

Ø 新建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等的使用参加其他文档。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: