我使用fabric8-karaf-1.1.0.CR5,其中包括:
.../system/org/apache/felix/org.apache.felix.framework/4.0.3.redhat-610379/org.apache.felix.framework-4.0.3.redhat-610379.jar
… / org.apache.felix.framework-4.0.0 / doc / changelog.txt包含:
** New Feature * [FELIX-2959] - [Framework] Implement OSGi R4.3 class loader byte-code weaving hook
我添加到…/etc/startup.properties: igb/igb.osgi.weaving/1.0.0/igb.osgi.weaving-1.0.0.jar=1 我的捆绑包激活器:
igb/igb.osgi.weaving/1.0.0/igb.osgi.weaving-1.0.0.jar=1
package igb.osgi.weaving; import java.util.Hashtable; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.hooks.weaving.WeavingHook; public class Activator implements BundleActivator { public void start( BundleContext bc ) throws Exception { System.out.println( "Starting " + Activator.class.getName() ); // this doesn't work //bc.registerService( Weaver.class, new Weaver(), new Hashtable<String, Object>() ); // this is the proper way, see BJ Hargrave's accepted answer below bc.registerService( WeavingHook.class, new Weaver(), new Hashtable<String, Object>() ); } public void stop( BundleContext bc ) throws Exception { System.out.println( "Stopping " + Activator.class.getName() ); } } // Activator
我的编织钩:
package igb.osgi.weaving; import org.osgi.framework.hooks.weaving.WeavingHook; import org.osgi.framework.hooks.weaving.WovenClass; public class Weaver implements WeavingHook { synchronized public void weave( WovenClass wc ) { System.out.println( "Weaving " + wc.getClassName() ); } } // Weaver .../system/igb/igb.osgi.weaving/1.0.0/igb.osgi.weaving-1.0.0.jar/META-INF/MANIFEST.MF: Manifest-Version: 1.0 Bnd-LastModified: 1406380868073 Build-Jdk: 1.7.0_51 Built-By: Geri Bundle-Activator: igb.osgi.weaving.Activator Bundle-ManifestVersion: 2 Bundle-Name: IGB OSGi Weaving Bundle-SymbolicName: igb.osgi.weaving Bundle-Version: 1.0.0 Created-By: Apache Maven Bundle Plugin Export-Package: igb.osgi.weaving;uses:="org.osgi.framework,org.osgi.fram ework.hooks.weaving";version="1.0.0" Import-Package: org.osgi.framework;version="[1.7,2)",org.osgi.framework. hooks.weaving;version="[1.0,2)" Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.7))" Tool: Bnd-2.3.0.201405100607
我的捆绑包是从Fabric8的开头开始的:
Please wait while Fabric8 is loading... Starting igb.osgi.weaving.Activator 100% [========================================================================] ______ _ _ _____ | ___| | | (_) | _ | | |_ __ _| |__ _ __ _ ___ \ V / | _/ _` | '_ \| '__| |/ __|/ _ \ | || (_| | |_) | | | | (__| |_| | \_| \__,_|_.__/|_| |_|\___\_____/ Fabric8 Container (1.1.0.CR5) http://fabric8.io/ Type 'help' to get started and 'help [cmd]' for help on a specific command. Hit '<ctrl-d>' or 'osgi:shutdown' to shutdown this container. Open a browser to http://localhost:8181 to access the management console Create a new Fabric via 'fabric:create' or join an existing Fabric via 'fabric:join [someUrls]' Fabric8:karaf@root>
但是我的Weaver对象没有输出“ Weaving …”。
我的捆绑包处于活动状态:
Fabric8:karaf@root> list|grep IGB [ 1] [Active ] [ ] [ 1] IGB OSGi Weaving (1.0.0)
我的Weaver服务得到认可:
Fabric8:karaf@root> ls 1 You are about to access system bundle 1. Do you wish to continue (yes/no): yes IGB OSGi Weaving (1) provides: ------------------------------ objectClass = igb.osgi.weaving.Weaver service.id = 3
但是似乎没有使用它:
Fabric8:karaf@root> ls -u|grep -i igb Fabric8:karaf@root>
线…/data/log/karaf.log包含igb:
Line 27: 2014-07-26 14:38:28,426 | DEBUG | -610379-thread-1 | BlueprintExtender | 10 - org.apache.aries.blueprint.core - 1.0.1.redhat-610379 | Scanning bundle igb.osgi.weaving for blueprint application Line 28: 2014-07-26 14:38:28,426 | DEBUG | -610379-thread-1 | BlueprintExtender | 10 - org.apache.aries.blueprint.core - 1.0.1.redhat-610379 | No blueprint application found in bundle igb.osgi.weaving Line 6824: 2014-07-26 14:38:33,028 | DEBUG | y-1.1.0-thread-1 | geronimo-osgi-registry | 113 - org.apache.geronimo.specs.geronimo-osgi-registry - 1.1.0 | Bundle Considered for class providers: igb.osgi.weaving Line 6825: 2014-07-26 14:38:33,028 | DEBUG | y-1.1.0-thread-1 | geronimo-osgi-registry | 113 - org.apache.geronimo.specs.geronimo-osgi-registry - 1.1.0 | adding bundle igb.osgi.weaving [1] Line 12143: 2014-07-26 14:38:39,783 | INFO | .Beta37-thread-1 | runtime | 59 - gravia-runtime-api - 1.1.0.Beta37 | Installed: Module[igb.osgi.weaving:1.0.0] Line 12343: 2014-07-26 14:38:40,017 | DEBUG | .Beta37-thread-1 | resource | 58 - gravia-resource - 1.1.0.Beta37 | Add to RuntimeEnvironment: Resource[igb.osgi.weaving:1.0.0] Line 12344: 2014-07-26 14:38:40,017 | DEBUG | .Beta37-thread-1 | resource | 58 - gravia-resource - 1.1.0.Beta37 | IdentityCapability[atts={gravia.identity=igb.osgi.weaving, version=1.0.0},[igb.osgi.weaving:1.0.0]] Line 12344: 2014-07-26 14:38:40,017 | DEBUG | .Beta37-thread-1 | resource | 58 - gravia-resource - 1.1.0.Beta37 | IdentityCapability[atts={gravia.identity=igb.osgi.weaving, version=1.0.0},[igb.osgi.weaving:1.0.0]] Line 13469: 2014-07-26 14:38:43,168 | DEBUG | -2.13.2-thread-1 | Activator | 155 - org.apache.camel.camel-core - 2.13.2 | Bundle started: igb.osgi.weaving
在OSGi服务平台第四版4.3版核心规格,56.3编织服务社,351页记载:
该框架获取Weaving Hook服务,并为必须加载的每个类调用其weave方法。
我将其解释为无事可做。我哪里错了?
PS:Activator的代码适合于反映已接受的答案。