OSGi, Felix, Maven, Pax Plugin, Eclipse

7.0 采用了osgi作为基础架构,平台已经差不多搭建完毕,项目正在开发上面的服务,因为之前没有参加基础架构搭建的工作,所以从头开始研究一下OSGi,然后发现开发环境不太理想,具体来说,maven-pax-plugin包装好的osgi环境还算方便,就是和eclipse的集成还不行。

准备说一说我是如何把开发环境理顺的。

首先是Maven Pax Plugin,如他项目主页介绍的,这款插件是OSGi的瑞士军刀,提供了创建,构建,管理,部署多种类型的OSGi bundle。它提供了一些脚本可供调用,也可以在maven命令行直接使用,这个比较赞。默认使用的是Felix的OSGi实现。

然后学习OSGi最好是找篇教程,Felix提供的这个教程貌似不错,我就准备照这个走一遍看看。

第一个例子是ServiceEventListener,例子不错但是教程本身没说如何创建此工程,我参考了maven-pax-plugin的usage页,用到两个命令mvn org.ops4j:maven-pax-plugin:create-project和mvn pax:create-bundle,然后用mvn eclipse:eclipse创建eclipse工程文件。

命令如下:

>mvn org.ops4j:maven-pax-plugin:create-project "-DgroupId=my.example" "-DartifactId=project"
>cd project
>mvn pax:create-bundle "-DbundleName=simple-api" "-Dpackage=org.example.simple" "-Dinternals=false"
>mvn pax:create-bundle "-DbundleName=simple-impl" "-Dpackage=org.example.simple" "-Dinterface=false"
>cd simple-api
>mvn eclipse:eclipse
>cd ../simple-impl
>mvn eclipse:eclipse

然后我就把这两个工程simple-api和simple-impl导入到了eclipse,首先发现两个问题

1. 这两个工程都不是Maven工程,而且项目依赖不正确
2. 这两个项目的pom文件都是红的,提示compile和testCompile相关的错

那我是怎么手工修这两个问题的呢?

1. right click project -> config -> Convert to maven project
首先将这两个工程转换成Mavn工程
然后,打开.classpath文件,将两个osgiR4的jar包依赖替换成这个

<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>;

2. 打开pom文件,用提示的quickFix修改掉这两个编译的问题,这时候pom文件里会多出这么一段

<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
  			<plugin>
  				<groupId>org.eclipse.m2e</groupId>
  				<artifactId>lifecycle-mapping</artifactId>
  				<version>1.0.0</version>
  				<configuration>
  					<lifecycleMappingMetadata>
  						<pluginExecutions>
  							<pluginExecution>
  								<pluginExecutionFilter>
  									<groupId>org.ops4j</groupId>
  									<artifactId>
  										maven-pax-plugin
  									</artifactId>
  									<versionRange>
  										[1.5,)
  									</versionRange>
  									<goals>
  										<goal>testCompile</goal>
  										<goal>compile</goal>
  									</goals>
  								</pluginExecutionFilter>
  								<action>
  									<ignore></ignore>
  								</action>
  							</pluginExecution>
  						</pluginExecutions>
  					</lifecycleMappingMetadata>
  				</configuration>
  			</plugin>

3. 这时候还需要right click project -> Maven -> update project configuration

这时候,环境问题基本就OK了,照着例子敲好代码,然后mvn clean install pax:provision就OK了

g! lb
START LEVEL 6
ID|State |Level|Name
0|Active | 0|System Bundle (4.0.2)
1|Active | 5|my.example.project.simple-api [org.example.simple] (1.0.1.SNAPSHOT)
2|Active | 5|my.example.project.simple-impl [org.example.simple] (1.0.1.SNAPSHOT)
3|Active | 1|Apache Felix Gogo Command (0.12.0)
4|Active | 1|Apache Felix Gogo Runtime (0.10.0)
5|Active | 1|Apache Felix Gogo Shell (0.10.0)

Note: 另外编译的时候发现版本问题,在顶级pom里加上这么一段解决了,还不知道本质原因

<plugin><!-- Compile -->
		        <groupId>org.apache.maven.plugins</groupId>
		        <artifactId>maven-compiler-plugin</artifactId>
		        <configuration>
		          <source>1.6</source>
		          <target>1.6</target>
		        </configuration>
		        <executions>
		          <execution>
		            <id>compile-for-this-application</id>
		            <goals>
		              <goal>compile</goal>
		            </goals>
		          </execution>
		        </executions>
	      </plugin>