如题,整合两个框架的目的就是利用spring来管理Bean的生命周期和进行一些依赖注入!参考了http://www.ibm.com/developerworks/cn/webservices/ws-osgi-spring2/了一文;但是该文还是有很多问题,经过长时间的摸索和尝试,终于成功的把两个框架整和了;以下是主要的步骤
一 下载Spring DM必须的包
下载的url为http://sourceforge.net/projects/springframework/files/spring-osgi/1.0.3/spring-osgi-1.0.3-with-dependencies.zip/download 和 http://nchc.dl.sourceforge.net/project/springframework/spring-osgi/1.0.3/spring-osgi-1.0.3.zip
二 解压第一步下载所得文件,把spring DM启动时候必要的Bundle对应的jar包放到Fleix安装目录/bunld目录下,这里所说
的必要jar包为 aopalliance.osgi-1.0-SNAPSHOT.jar jcl104-over-slf4j-1.4.3.jar log4j.osgi-1.2.15-SNAPSHOT.jar org.apache.felix.main-1.0.1.jar slf4j-api-1.4.3.jar lf4j-log4j12-1.4.3.jar spring-aop-2.5.1.jar spring-beans-2.5.1.jar spring-context-2.5.1.jar spring-core-2.5.1.jar spring-osgi-core-1.0.3.jar spring-osgi-io-1.0.3.jar spring-osgi-extender-1.0.3.jar
三 修改felix安装目录/conf/config.properties文件,主要目的是使得spring DM必要的Bundle随Felix启动而启动,以
以下为修改后的文件内容,红色部分为和默认配置不同的地方
# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # # Framework config properties. # org.osgi.framework.system.packages=org.osgi.framework; version=1.3.0, \ org.osgi.service.packageadmin; version=1.2.0, \ org.osgi.service.startlevel; version=1.0.0, \ org.osgi.service.url; version=1.0.0, \ org.osgi.util.tracker; version=1.3.2 \ ${jre-${java.specification.version}} #org.osgi.framework.bootdelegation=sun.*,com.sun.* #felix.cache.profile=foo felix.auto.start.1= \ file:bundle/org.apache.felix.bundlerepository-1.0.3.jar \ file:bundle/org.apache.felix.shell.tui-1.0.1.jar \ file:bundle/org.apache.felix.shell-1.0.1.jar \ file:bundle/aopalliance.osgi-1.0-SNAPSHOT.jar \ file:bundle/jcl104-over-slf4j-1.4.3.jar \ file:bundle/log4j.osgi-1.2.15-SNAPSHOT.jar \ file:bundle/org.apache.felix.main-1.0.1.jar \ file:bundle/slf4j-api-1.4.3.jar \ file:bundle/slf4j-log4j12-1.4.3.jar \ file:bundle/spring-aop-2.5.1.jar \ file:bundle/spring-beans-2.5.1.jar \ file:bundle/spring-context-2.5.1.jar \ file:bundle/spring-core-2.5.1.jar \ file:bundle/spring-osgi-core-1.0.3.jar \ file:bundle/spring-osgi-io-1.0.3.jar \ file:bundle/spring-osgi-extender-1.0.3.jar felix.log.level=4 felix.startlevel.framework=1 felix.startlevel.bundle=1 #felix.service.urlhandlers=false # # Bundle config properties. # org.osgi.service.http.port=8080 osgi.shell.telnet=on #obr.repository.url=http://bundles.osgi.org/obr/browse?_xml=1&cmd=repository # # Java platform package export properties. # jre-1.3=, \ javax.accessibility; \ javax.naming; \ javax.naming.directory; \ javax.naming.event; \ javax.naming.ldap; \ javax.naming.spi; \ javax.rmi; \ javax.rmi.CORBA; \ javax.sound.midi; \ javax.sound.midi.spi; \ javax.sound.sampled; \ javax.sound.sampled.spi; \ javax.swing; \ javax.swing.border; \ javax.swing.colorchooser; \ javax.swing.event; \ javax.swing.filechooser; \ javax.swing.plaf; \ javax.swing.plaf.basic; \ javax.swing.plaf.metal; \ javax.swing.plaf.multi; \ javax.swing.table; \ javax.swing.text; \ javax.swing.text.html; \ javax.swing.text.html.parser; \ javax.swing.text.rtf; \ javax.swing.tree; \ javax.swing.undo; \ javax.transaction; \ org.omg.CORBA; \ org.omg.CORBA_2_3; \ org.omg.CORBA_2_3.portable; \ org.omg.CORBA.DynAnyPackage; \ org.omg.CORBA.ORBPackage; \ org.omg.CORBA.portable; \ org.omg.CORBA.TypeCodePackage; \ org.omg.CosNaming; \ org.omg.CosNaming.NamingContextPackage; \ org.omg.SendingContext; \ org.omg.stub.java.rmi; \ version="1.3.0" jre-1.4=, \ javax.accessibility; \ javax.crypto; \ javax.crypto.interfaces; \ javax.crypto.spec; \ javax.imageio; \ javax.imageio.event; \ javax.imageio.metadata; \ javax.imageio.plugins.jpeg; \ javax.imageio.spi; \ javax.imageio.stream; \ javax.naming; \ javax.naming.directory; \ javax.naming.event; \ javax.naming.ldap; \ javax.naming.spi; \ javax.net; \ javax.net.ssl; \ javax.print; \ javax.print.attribute; \ javax.print.attribute.standard; \ javax.print.event; \ javax.rmi; \ javax.rmi.CORBA; \ javax.security.auth; \ javax.security.auth.callback; \ javax.security.auth.kerberos; \ javax.security.auth.login; \ javax.security.auth.spi; \ javax.security.auth.x500; \ javax.sound.midi; \ javax.sound.midi.spi; \ javax.sound.sampled; \ javax.sound.sampled.spi; \ javax.sql; \ javax.swing; \ javax.swing.border; \ javax.swing.colorchooser; \ javax.swing.event; \ javax.swing.filechooser; \ javax.swing.plaf; \ javax.swing.plaf.basic; \ javax.swing.plaf.metal; \ javax.swing.plaf.multi; \ javax.swing.table; \ javax.swing.text; \ javax.swing.text.html; \ javax.swing.text.html.parser; \ javax.swing.text.rtf; \ javax.swing.tree; \ javax.swing.undo; \ javax.transaction; \ javax.transaction.xa; \ javax.xml.parsers; \ javax.xml.transform; \ javax.xml.transform.dom; \ javax.xml.transform.sax; \ javax.xml.transform.stream; \ org.ietf.jgss; \ org.omg.CORBA; \ org.omg.CORBA_2_3; \ org.omg.CORBA_2_3.portable; \ org.omg.CORBA.DynAnyPackage; \ org.omg.CORBA.ORBPackage; \ org.omg.CORBA.portable; \ org.omg.CORBA.TypeCodePackage; \ org.omg.CosNaming; \ org.omg.CosNaming.NamingContextExtPackage; \ org.omg.CosNaming.NamingContextPackage; \ org.omg.Dynamic; \ org.omg.DynamicAny; \ org.omg.DynamicAny.DynAnyFactoryPackage; \ org.omg.DynamicAny.DynAnyPackage; \ org.omg.IOP; \ org.omg.IOP.CodecFactoryPackage; \ org.omg.IOP.CodecPackage; \ org.omg.Messaging; \ org.omg.PortableInterceptor; \ org.omg.PortableInterceptor.ORBInitInfoPackage; \ org.omg.PortableServer; \ org.omg.PortableServer.CurrentPackage; \ org.omg.PortableServer.POAManagerPackage; \ org.omg.PortableServer.POAPackage; \ org.omg.PortableServer.portable; \ org.omg.PortableServer.ServantLocatorPackage; \ org.omg.SendingContext; \ org.omg.stub.java.rmi; \ org.w3c.dom; \ org.w3c.dom.css; \ org.w3c.dom.events; \ org.w3c.dom.html; \ org.w3c.dom.stylesheets; \ org.w3c.dom.traversal; \ org.w3c.dom.views; \ org.xml.sax; \ org.xml.sax.ext; \ org.xml.sax.helpers; \ version="1.4.0" jre-1.5=, \ javax.accessibility; \ javax.activity; \ javax.crypto; \ javax.crypto.interfaces; \ javax.crypto.spec; \ javax.imageio; \ javax.imageio.event; \ javax.imageio.metadata; \ javax.imageio.plugins.bmp; \ javax.imageio.plugins.jpeg; \ javax.imageio.spi; \ javax.imageio.stream; \ javax.management; \ javax.management.loading; \ javax.management.modelmbean; \ javax.management.monitor; \ javax.management.openmbean; \ javax.management.relation; \ javax.management.remote; \ javax.management.remote.rmi; \ javax.management.timer; \ javax.naming; \ javax.naming.directory; \ javax.naming.event; \ javax.naming.ldap; \ javax.naming.spi; \ javax.net; \ javax.net.ssl; \ javax.print; \ javax.print.attribute; \ javax.print.attribute.standard; \ javax.print.event; \ javax.rmi; \ javax.rmi.CORBA; \ javax.rmi.ssl; \ javax.security.auth; \ javax.security.auth.callback; \ javax.security.auth.kerberos; \ javax.security.auth.login; \ javax.security.auth.spi; \ javax.security.auth.x500; \ javax.security.sasl; \ javax.sound.midi; \ javax.sound.midi.spi; \ javax.sound.sampled; \ javax.sound.sampled.spi; \ javax.sql; \ javax.sql.rowset; \ javax.sql.rowset.serial; \ javax.sql.rowset.spi; \ javax.swing; \ javax.swing.border; \ javax.swing.colorchooser; \ javax.swing.event; \ javax.swing.filechooser; \ javax.swing.plaf; \ javax.swing.plaf.basic; \ javax.swing.plaf.metal; \ javax.swing.plaf.multi; \ javax.swing.plaf.synth; \ javax.swing.table; \ javax.swing.text; \ javax.swing.text.html; \ javax.swing.text.html.parser; \ javax.swing.text.rtf; \ javax.swing.tree; \ javax.swing.undo; \ javax.transaction; \ javax.transaction.xa; \ javax.xml; \ javax.xml.datatype; \ javax.xml.namespace; \ javax.xml.parsers; \ javax.xml.transform; \ javax.xml.transform.dom; \ javax.xml.transform.sax; \ javax.xml.transform.stream; \ javax.xml.validation; \ javax.xml.xpath; \ org.ietf.jgss; \ org.omg.CORBA; \ org.omg.CORBA_2_3; \ org.omg.CORBA_2_3.portable; \ org.omg.CORBA.DynAnyPackage; \ org.omg.CORBA.ORBPackage; \ org.omg.CORBA.portable; \ org.omg.CORBA.TypeCodePackage; \ org.omg.CosNaming; \ org.omg.CosNaming.NamingContextExtPackage; \ org.omg.CosNaming.NamingContextPackage; \ org.omg.Dynamic; \ org.omg.DynamicAny; \ org.omg.DynamicAny.DynAnyFactoryPackage; \ org.omg.DynamicAny.DynAnyPackage; \ org.omg.IOP; \ org.omg.IOP.CodecFactoryPackage; \ org.omg.IOP.CodecPackage; \ org.omg.Messaging; \ org.omg.PortableInterceptor; \ org.omg.PortableInterceptor.ORBInitInfoPackage; \ org.omg.PortableServer; \ org.omg.PortableServer.CurrentPackage; \ org.omg.PortableServer.POAManagerPackage; \ org.omg.PortableServer.POAPackage; \ org.omg.PortableServer.portable; \ org.omg.PortableServer.ServantLocatorPackage; \ org.omg.SendingContext; \ org.omg.stub.java.rmi; \ org.omg.stub.javax.management.remote.rmi; \ org.w3c.dom; \ org.w3c.dom.bootstrap; \ org.w3c.dom.css; \ org.w3c.dom.events; \ org.w3c.dom.html; \ org.w3c.dom.ls; \ org.w3c.dom.ranges; \ org.w3c.dom.stylesheets; \ org.w3c.dom.traversal; \ org.w3c.dom.views; \ org.xml.sax; \ org.xml.sax.ext; \ org.xml.sax.helpers; \ version="1.5.0" jre-1.6=, \ javax.accessibility; \ javax.activation; \ javax.activity; \ javax.annotation; \ javax.annotation.processing; \ javax.crypto; \ javax.crypto.interfaces; \ javax.crypto.spec; \ javax.imageio; \ javax.imageio.event; \ javax.imageio.metadata; \ javax.imageio.plugins.bmp; \ javax.imageio.plugins.jpeg; \ javax.imageio.spi; \ javax.imageio.stream; \ javax.jws; \ javax.jws.soap; \ javax.lang.model; \ javax.lang.model.element; \ javax.lang.model.type; \ javax.lang.model.util; \ javax.management; \ javax.management.loading; \ javax.management.modelmbean; \ javax.management.monitor; \ javax.management.openmbean; \ javax.management.relation; \ javax.management.remote; \ javax.management.remote.rmi; \ javax.management.timer; \ javax.naming; \ javax.naming.directory; \ javax.naming.event; \ javax.naming.ldap; \ javax.naming.spi; \ javax.net; \ javax.net.ssl; \ javax.print; \ javax.print.attribute; \ javax.print.attribute.standard; \ javax.print.event; \ javax.rmi; \ javax.rmi.CORBA; \ javax.rmi.ssl; \ javax.script; \ javax.security.auth; \ javax.security.auth.callback; \ javax.security.auth.kerberos; \ javax.security.auth.login; \ javax.security.auth.spi; \ javax.security.auth.x500; \ javax.security.cert; \ javax.security.sasl; \ javax.sound.midi; \ javax.sound.midi.spi; \ javax.sound.sampled; \ javax.sound.sampled.spi; \ javax.sql; \ javax.sql.rowset; \ javax.sql.rowset.serial; \ javax.sql.rowset.spi; \ javax.swing; \ javax.swing.border; \ javax.swing.colorchooser; \ javax.swing.event; \ javax.swing.filechooser; \ javax.swing.plaf; \ javax.swing.plaf.basic; \ javax.swing.plaf.metal; \ javax.swing.plaf.multi; \ javax.swing.plaf.synth; \ javax.swing.table; \ javax.swing.text; \ javax.swing.text.html; \ javax.swing.text.html.parser; \ javax.swing.text.rtf; \ javax.swing.tree; \ javax.swing.undo; \ javax.tools; \ javax.transaction; \ javax.transaction.xa; \ javax.xml; \ javax.xml.bind; \ javax.xml.bind.annotation; \ javax.xml.bind.annotation.adapters; \ javax.xml.bind.attachment; \ javax.xml.bind.helpers; \ javax.xml.bind.util; \ javax.xml.crypto; \ javax.xml.crypto.dom; \ javax.xml.crypto.dsig; \ javax.xml.crypto.dsig.dom; \ javax.xml.crypto.dsig.keyinfo; \ javax.xml.crypto.dsig.spec; \ javax.xml.datatype; \ javax.xml.namespace; \ javax.xml.parsers; \ javax.xml.soap; \ javax.xml.stream; \ javax.xml.stream.events; \ javax.xml.stream.util; \ javax.xml.transform; \ javax.xml.transform.dom; \ javax.xml.transform.sax; \ javax.xml.transform.stax; \ javax.xml.transform.stream; \ javax.xml.validation; \ javax.xml.ws; \ javax.xml.ws.handler; \ javax.xml.ws.handler.soap; \ javax.xml.ws.http; \ javax.xml.ws.soap; \ javax.xml.ws.spi; \ javax.xml.xpath; \ org.ietf.jgss; \ org.omg.CORBA; \ org.omg.CORBA_2_3; \ org.omg.CORBA_2_3.portable; \ org.omg.CORBA.DynAnyPackage; \ org.omg.CORBA.ORBPackage; \ org.omg.CORBA.portable; \ org.omg.CORBA.TypeCodePackage; \ org.omg.CosNaming; \ org.omg.CosNaming.NamingContextExtPackage; \ org.omg.CosNaming.NamingContextPackage; \ org.omg.Dynamic; \ org.omg.DynamicAny; \ org.omg.DynamicAny.DynAnyFactoryPackage; \ org.omg.DynamicAny.DynAnyPackage; \ org.omg.IOP; \ org.omg.IOP.CodecFactoryPackage; \ org.omg.IOP.CodecPackage; \ org.omg.Messaging; \ org.omg.PortableInterceptor; \ org.omg.PortableInterceptor.ORBInitInfoPackage; \ org.omg.PortableServer; \ org.omg.PortableServer.CurrentPackage; \ org.omg.PortableServer.POAManagerPackage; \ org.omg.PortableServer.POAPackage; \ org.omg.PortableServer.portable; \ org.omg.PortableServer.ServantLocatorPackage; \ org.omg.SendingContext; \ org.omg.stub.java.rmi; \ org.omg.stub.javax.management.remote.rmi; \ org.w3c.dom; \ org.w3c.dom.bootstrap; \ org.w3c.dom.css; \ org.w3c.dom.events; \ org.w3c.dom.html; \ org.w3c.dom.ls; \ org.w3c.dom.ranges; \ org.w3c.dom.stylesheets; \ org.w3c.dom.traversal; \ org.w3c.dom.views; \ org.w3c.dom.xpath; \ org.xml.sax; \ org.xml.sax.ext; \ org.xml.sax.helpers; \ version=\"1.6.0\"
四 编写服务端和客户端代码,需要留意的是代码和felix没有任何依赖,就和普通的java类一样
服务端代码
OrderService类
package order; public interface OrderService { public void processOrder(); }OrderServiceImpl类
写道 package order.impl; import order.OrderService; public class OrderServiceImpl implements OrderService { public void start() { System.out.println("Order Service registered"); } public void stop() { System.out.println("Order Service stopped"); } public void processOrder() { System.out.println("第二版本发布了 id: ORD123") ; } }客户端代码:
OrderClient类
package order.client; import order.OrderService; public class OrderClient { private OrderService orderService; public void setOrderService(OrderService orderService) { this.orderService = orderService; } public void removeService() { this.orderService = null; } public void start() { System.out.println("客户端启动了---"); orderService.processOrder(); } public void stop() { System.out.println("第二版本我想顶人啊---Bundle dds ----dddsstopped"); } }五 运行两个工程(服务端和客户端)目录下的buildxxx.xml文件打包,文件已经在附件中,在这里不再赘述
六 把第五步打包所得的jar发布到felix,和发布普通的bundle没有任何区别,在在这里不再赘述!
七 启动第六步安装的两个bundle就可以看到效果了 (felix控制台输入为:第二版本发布了 id: ORD123,这就说明程序运行正确了)