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>