Hello!I am trying to embed Felix as a bundle. This is related to some issues that I want to solve but the problem is not here.
I followed the wiki about how to embed Felix and everything gone fine, i.e, my app is running the way I want.
However as I say I need to embed Felix as an OSGi bundle but I'm having the (classical) classloading problems.
Basicaly I built a simple bundle in whose Activator I do all the necessary steps to embed Felix as in the tutorial.
To this point everything goes fine.But I also want to export some services through the system bundle. To do this I register a simple service within the embed Felix Activator, and adjust the manifest
accordingly.However when I try to start a bundle in the embed Felix (not in the "main instance") that uses the exported service it fails with a classnotfoundexception as show below:
(Lines with #### are comments made by me right now) -> vgw start file:/tmp/hw.jar Hello World... ####Checking for all services BundleSystem BundleProperty objectClass org.osgi.service.startlevel.StartLevel
Property service.id -> 1
BundleSystem Bundle
Property objectClass
org.osgi.service.packageadmin.PackageAdmin
Property service.id -> 2
BundleSystem Bundle
Property myey -> myalue
####My service is here!!!!
Property objectClass voc.vh.iface.Lookup
Property service.id -> 3
#### This is the class of the service object retrieved with
BundleContext#getService(...)
O is [EMAIL PROTECTED] #### This are the interfaces implemented by the above object EC isClazz: voc.vh.iface.Lookup#### This is the result of invoking a method into the obtained object through reflection
Hello BLA BLA#### And those are the exceptions obtained when I try to cast the obtained object to its interface
org.osgi.framework.BundleException: Activator start error.
at org.apache.felix.framework.Felix._startBundle(Felix.java:1652)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1542)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:369)
at
voc.vh.HostApplication.startVirtualizedApplication(HostApplication.java:120)
at voc.vh.HostApplication.execute(HostApplication.java:171)
at
org.apache.felix.shell.impl.Activator$ShellServiceImpl.executeCommand(Activator.java:276)
at
org.apache.felix.shell.tui.Activator$ShellTuiRunnable.run(Activator.java:180)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NoClassDefFoundError: voc/vh/iface/Lookup
at voc.tt.HelloWorld.start(HelloWorld.java:81)
at
org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:591)
at org.apache.felix.framework.Felix._startBundle(Felix.java:1608)
... 7 more
Caused by: java.lang.ClassNotFoundException: voc.vh.iface.Lookup
at
org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.findClass(R4SearchPolicyCore.java:200)
at
org.apache.felix.framework.searchpolicy.R4SearchPolicy.findClass(R4SearchPolicy.java:45)
at
org.apache.felix.framework.searchpolicy.ContentClassLoader.loadClass(ContentClassLoader.java:109)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
... 10 more
Caused by: java.lang.ClassNotFoundException: voc.vh.iface.Lookup
at
org.apache.felix.framework.searchpolicy.R4Wire.getClass(R4Wire.java:109)
at
org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.searchImports(R4SearchPolicyCore.java:507)
at
org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.findClassOrResource(R4SearchPolicyCore.java:468)
at
org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.findClass(R4SearchPolicyCore.java:187)
... 14 more
Bundle Started
Attached are the relevant code:
Lookup: is the service interface
LookupImpl: is the implementation of that interface
HostActivator: is the activator for the hosting bundle
HostApplication: is the main class of the bundle that embeds felix
manifest_hostBundle: is the manifest for the above bundle
manifest_helloWorld: is the manifest for the client bundle of the service
HelloWorld: is the only class of the bundle that is launched inside the
embed Felix
Please note that if the HostApplication is run as a normal java application everything goes fine.
Sorry if the information is overwhelming, any help will be appreciated. mm
package voc.vh;
import java.util.Dictionary;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import voc.vh.iface.Lookup;
public class HostActivator implements BundleActivator
{
private BundleContext m_context = null;
public void start(BundleContext context)
{
m_context = context;
Dictionary d = new java.util.Hashtable();
d.put("myey", "myalue");
context.registerService(Lookup.class.getName(),
new LookupImpl(), d);
}
public void stop(BundleContext context)
{
m_context = null;
}
}package voc.vh;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.felix.framework.Felix;
import org.apache.felix.framework.cache.BundleCache;
import org.apache.felix.framework.util.FelixConstants;
import org.apache.felix.framework.util.StringMap;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceRegistration;
public class HostApplication implements BundleActivator {
private Felix m_felix = null;
private ServiceRegistration serviceRegistration = null;
public static void main(String[] args) {
HostApplication ha = new HostApplication();
ha.startVirtualHost();
ha.startVirtualizedApplication("file:/tmp/hw.jar");
// ha.shutdownApplication();
}
public void startVirtualHost() {
// Create a case-insensitive configuration property map.j
Map configMap = new StringMap(false);
// Configure the Felix instance to be embedded.
configMap.put(FelixConstants.EMBEDDED_EXECUTION_PROP, "true");
// Add core OSGi packages to be exported from the class path
// via the system bundle.
configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES,
"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,"
+ "voc.vh.iface,"
+
"org.apache.felix.shell.impl");
// Explicitly specify the directory to use for caching bundles.
configMap.put(BundleCache.CACHE_PROFILE_DIR_PROP,
"/tmp/felixCache");
try {
// Create host activator;
HostActivator ha = new HostActivator();
List list = new ArrayList();
list.add(ha);
// Now create an instance of the framework with
// our configuration properties and activator.
m_felix = new Felix(configMap, list);
// Now start Felix instance.
m_felix.start();
} catch (Exception ex) {
System.err.println("Could not create framework: " + ex);
ex.printStackTrace();
}
System.out.println("Felix Started");
}
public void startVirtualizedApplication(String path) {
try {
BundleContext bc = m_felix.getBundleContext();
Bundle b = bc.installBundle(path);
b.start();
} catch (BundleException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Bundle Started");
}
public void shutdownApplication() {
// Shut down the felix framework when stopping the
// host application.
try {
m_felix.stop();
} catch (BundleException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// /// BundleActivator Implementation
public void start(BundleContext bc) throws Exception {
startVirtualHost();
startVirtualizedApplication("file:/tmp/hw.jar");
}
public void stop(BundleContext bc) throws Exception {
bc = null;
serviceRegistration.unregister();
System.out.println("Host stopped");
}
}package voc.vh;
import voc.vh.iface.Lookup;
public class LookupImpl implements Lookup {
public void hello(String name) {
System.out.println("Hello " + name + "!");
}
}
package voc.vh.iface;
public interface Lookup {
public void hello(String name);
}
Bundle-Activator: voc.tt.HelloWorld Import-Package: org.osgi.framework,voc.vh.iface Bundle-Name: Hello World Bundle-SymbolicName: helloworld
Bundle-Activator: voc.vh.HostApplication Import-Package: org.osgi.framework,org.apache.felix.shell,org.apache.felix.framework,org.apache.felix.framework.util,org.apache.felix.shell.impl.Util,org.osgi.util.tracker Bundle-Name: Virtual OSGi Containers Bundle-SymbolicName: VOC
package voc.tt;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import voc.vh.iface.Lookup;
public class HelloWorld implements BundleActivator{
public void start(BundleContext bc) throws Exception {
System.out.println("Hello World...");
//
for (ServiceReference sr : bc.getAllServiceReferences(null,
null)) {
System.out.println("Bundle" +
sr.getBundle().getSymbolicName());
for (String p : sr.getPropertyKeys()) {
if (p.equalsIgnoreCase("objectClass")) {
System.out.print("\tProperty " + p );
for (String x : (String[])
sr.getProperty(p)) {
System.out.println("\t\t"+x);
}
}
else
System.out.println("\tProperty " + p +
" -> " + sr.getProperty(p));
}
}
ServiceReference bla =
bc.getServiceReference("voc.vh.iface.Lookup");
Object o = bc.getService(bla);
System.out.println("O is " + o);
System.out.print("EC is" );
for ( Class clazz : o.getClass().getInterfaces()){
System.out.println("Clazz: " + clazz.getName());
}
o.getClass().getDeclaredMethod("hello", new
Class[]{String.class}).invoke(o, new String[]{"BLA BLA"});
// (o.getClass().getDeclaredMethods()[0).invoke("hello", "BLA
BLA"));
Lookup l = (Lookup) o;
// (Lookup) o;
// Lookup look = (Lookup)
bc.getService(bc.getServiceReference("voc.vh.iface.Lookup"));
//
// l.hello("BLA BLA");
}
public void stop(BundleContext arg0) throws Exception {
System.out.println("Bye World...");
}
public void hello(String name) {
System.out.println("Hello " + name + "!");
}
}
smime.p7s
Description: S/MIME Cryptographic Signature

