- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用 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
我的包的激活器:
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 ...”输出。
我的包是 Activity 的:
Fabric8:karaf@root> list|grep IGB
[ 1] [Active ] [ ] [ 1] IGB OSGi Weaving (1.0.0)
My 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>
包含 igb
的 .../data/log/karaf.log
行:
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 Service Platform Release 4 Version 4.3 Core Specification, 56.3 The Weaving Service, page 351阅读:
The framework picks up the Weaving Hook services and calls their weave method for each class that must be loaded.
我将此解释为无事可做。我哪里错了?
PS:Activator
的代码经过调整以反射(reflect)已接受的答案。
最佳答案
您需要在 OSGi Weaving Hook 服务名称下注册该服务,以便框架可以找到它。
bc.registerService( org.osgi.framework.hooks.weaving.WeavingHook.class, new Weaver(), new Hashtable<String, Object>() );
框架不知道您的 igb.osgi.weaving.Weaver 服务是什么。
关于java - 未调用 Apache Felix OSGi 框架的 WeavingHook.weave() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24971215/
有人有任何使用 OSGi 4.3+ Weaving Hook 服务的示例吗? AspectJ、ASM、JavaAssist 怎么样?有人真的在使用 OSGi WeavingHooks 吗? OSGi
我使用 fabric8-karaf-1.1.0.CR5其中包括: .../system/org/apache/felix/org.apache.felix.framework/4.0.3.redhat
我是一名优秀的程序员,十分优秀!