如题,整合两个框架的目的就是利用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类
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,这就说明程序运行正确了)