Richard,
I started Felix as you suggested, deployed and started the bundles in
question:
Welcome to Felix.
=================
Enter profile name: test2
DEBUG: WIRE: 1.0 -> org.osgi.service.packageadmin ->
DEBUG: WIRE: 1.0 -> org.osgi.service.startlevel -> 0
DEBUG: WIRE: 1.0 -> org.ungoverned.osgi.service.shel
DEBUG: WIRE: 1.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 1.0 -> org.apache.felix.shell -> 1.0
DEBUG: WIRE: 2.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 2.0 -> org.apache.felix.shell -> 1.0
-> DEBUG: WIRE: 3.0 -> org.osgi.service.obr -> 3.0
DEBUG: WIRE: 3.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 3.0 -> org.apache.felix.shell -> 1.0
DEBUG: WIRE: 4.0 -> org.osgi.framework -> 0
Starting the ESP BaseBundleActivator:
DEBUG: WIRE: 5.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 6.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 7.0 -> com.lggi.esp.serviceimpl -> 7.0
DEBUG: WIRE: 7.0 -> com.lggi.esp.osgi.services -> 5.0
DEBUG: WIRE: 7.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 7.0 -> com.lggi.esp.osgi.entity -> 6.0
DEBUG: WIRE: 7.0 -> com.lggi.esp.osgi -> 4.0
Starting the ESP BaseBundleActivator:
Starting the ServiceImplActivator
shutdown
-> Stopping the BaseBundleActivator:
Stopping the ServiceImplActivator
Stopping the BaseBundleActivator:
In the embedded environment, the bundles com.lggi.esp.osgi.entity and
com.lggi.esp.osgi.services are part of the
org.osgi.framework.system.packages:
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,"
+ "com.lggi.esp.osgi.services; version=1.0.0,"
+ "com.lggi.esp.osgi.entity; version=1.0.0");
The other two bundles, com.lggi.esp.services and
com.lggi.esp.serviceimpl, are deployed as part of the AUTO_START_PROP
configMap.put(FelixConstants.AUTO_START_PROP +
".1","file:///D:\\development\\Brunswick-Maven\\spike\\embedded-osgi\\co
m.lggi.esp.osgi\\target\\osgi-base-1.0.0.jar "
+
"file:///D:\\development\\Brunswick-Maven\\spike\\embedded-osgi\\Leica-O
SGi-ServiceImpl-Bundle\\target\\osgi-service-impl-1.0.0.jar");
The manifest for the com.lggi.esp.osgi looks as follows:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: com.lggi.esp.osgi
Bundle-SymbolicName: com.lggi.esp.osgi
Bundle-Version: 1.0.0
Bundle-Activator: com.lggi.esp.osgi.BaseBundleActivator
Bundle-Localization: plugin
Export-Package: com.lggi.esp.osgi
Import-Package: org.osgi.framework;version="1.3.0"
All that is in the export package, com.lggi.esp.osgi, is a class,
BaseBundleActivator that is being extended by the
ServiceImplBundleActivator in the com.lggi.esp.serviceimpl bundle. The
planed purpose of the BaseBundleActivator is to encapsulate logic that
is specific to our application and make it available to sub types. As
shown earlier, the manifest looks like this for the
com.lggi.esp.serviceimpl bundle:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Leica Service Implementation
Bundle-SymbolicName: com.lggi.esp.serviceimpl
Bundle-Version: 1.0.0
Bundle-Localization: plugin
Bundle-Activator:
com.lggi.esp.serviceimpl.ServiceImplBundleActivator
Export-Package: com.lggi.esp.serviceimpl
Import-Package: com.lggi.esp.serviceimpl,
com.lggi.esp.osgi,
com.lggi.esp.osgi.entity,
com.lggi.esp.osgi.services,
org.osgi.framework;version="1.3.0"
The ServiceImplBundleActivator class looks as follows:
package com.lggi.esp.serviceimpl;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import com.lggi.esp.osgi.BaseBundleActivator;
import com.lggi.esp.osgi.services.UserManager;
/**
* Activator class for the plugin.
* @author admin
*/
public class ServiceImplBundleActivator extends BaseBundleActivator {
/**
*
*/
private static final long serialVersionUID = 9037128141796077810L;
/**
* Attribute specifying context attribute.
*/
private BundleContext context = null;
/**
* Attribute for service registration.
*/
private ServiceRegistration serRegistration = null;
/**
* Method to start the bundle.
*/
public void start(BundleContext context){
super.start(context);
System.out.println("Starting the ServiceImplActivator");
this.context = context;
UserManagerImpl impl = new UserManagerImpl();
//Register the property lookup service and save
//the service registration.
serRegistration = context.registerService(
UserManager.class.getName(), impl, null);
}
/**
* Method to stop the bundle.
*/
public void stop(BundleContext context) {
super.stop(context);
System.out.println("Stopping the ServiceImplActivator");
serRegistration.unregister ();
context = null;
}
/**
* Method to get the bundle context.
* @return BundleContext object.
*/
public BundleContext getContext() {
return context;
}
}
The BaseBundleActivator class from bundle com.lggi.esp.osgi looks as
follows:
package com.lggi.esp.osgi;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import java.io.Serializable;
/**
* Base Activator to access OSGi bundle context.
* @author admin
*
*/
public class BaseBundleActivator implements BundleActivator,
ServiceListener, Serializable {
/**
*
*/
private static final long serialVersionUID = -4834198125321168105L;
/**
* Attribute specifying context attribute.
*/
private BundleContext context = null;
/**
* Method to start the bundle.
*/
public void start(BundleContext p_Context) {
System.out.println("Starting the ESP BaseBundleActivator:");
context = p_Context;
}
/**
* Method to stop the bundle.
*/
public void stop(BundleContext p_Context) {
System.out.println("Stopping the BaseBundleActivator:");
context = null;
}
/**
* Method to get the bundle context.
* @return BundleContext object.
*/
public BundleContext getContext() {
return context;
}
/**
* Method to get all bundles in the OSGi registry.
*/
public Bundle[] getAllBundles() {
return context.getBundles();
}
/**
* Implements ServiceListener.serviceChanged().
* Prints the details of any service event from the framework.
* @param event the fired service event.
**/
public void serviceChanged(ServiceEvent event) {
String[] objectClass = (String[])
event.getServiceReference().getProperty("objectClass");
if (event.getType() == ServiceEvent.REGISTERED) {
System.out.println(
"Ex1: Service of type " + objectClass[0] + "
registered.");
} else if (event.getType() == ServiceEvent.UNREGISTERING) {
System.out.println(
"Ex1: Service of type " + objectClass[0] + "
unregistered.");
} else if (event.getType() == ServiceEvent.MODIFIED) {
System.out.println(
"Ex1: Service of type " + objectClass[0] + "
modified.");
}
}
}
Finally, the class that starts the imbedded instance of Felix looks like
this:
package com.lggi.esp.osgi;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import java.io.Serializable;
/**
* Base Activator to access OSGi registry.
* @author admin
*
*/
public class BaseBundleActivator implements BundleActivator,
ServiceListener, Serializable {
/**
*
*/
private static final long serialVersionUID = -4834198125321168105L;
/**
* Attribute specifying context attribute.
*/
private BundleContext context = null;
/**
* Method to start the bundle.
*/
public void start(BundleContext p_Context) {
System.out.println("Starting the ESP BaseBundleActivator:");
context = p_Context;
}
/**
* Method to stop the bundle.
*/
public void stop(BundleContext p_Context) {
System.out.println("Stopping the BaseBundleActivator:");
context = null;
}
/**
* Method to get the bundle context.
* @return BundleContext object.
*/
public BundleContext getContext() {
return context;
}
/**
* Method to get all bundles in the OSGi registry.
*/
public Bundle[] getAllBundles() {
return context.getBundles();
}
/**
* Implements ServiceListener.serviceChanged().
* Prints the details of any service event from the framework.
* @param event the fired service event.
**/
public void serviceChanged(ServiceEvent event) {
String[] objectClass = (String[])
event.getServiceReference().getProperty("objectClass");
if (event.getType() == ServiceEvent.REGISTERED) {
System.out.println(
"Ex1: Service of type " + objectClass[0] + "
registered.");
} else if (event.getType() == ServiceEvent.UNREGISTERING) {
System.out.println(
"Ex1: Service of type " + objectClass[0] + "
unregistered.");
} else if (event.getType() == ServiceEvent.MODIFIED) {
System.out.println(
"Ex1: Service of type " + objectClass[0] + "
modified.");
}
}
}
Thanks in advance for the assistance.
Regards,
Todd
-----Original Message-----
From: Richard S. Hall [mailto:[EMAIL PROTECTED]
Sent: Tuesday, June 26, 2007 3:44 AM
To: [email protected]
Subject: Re: Class load error with embedded bundle
[I gave this thread a subject...]
The first question I have is, does the bundle work when deployed into a
non-embedded Felix (i.e., from the Felix shell)?
-> richard
Todd Nist wrote:
> I am having problems with deploying a bundle when embedding Felix. I
do
> not believe that it has anything to do with the fact that it is
> embedded.
>
> I have the following manifest:
>
> Manifest-Version: 1.0
> Bundle-ManifestVersion: 2
> Bundle-Name: Leica Service Implementation
> Bundle-SymbolicName: com.lggi.esp.serviceimpl
> Bundle-Version: 1.0.0
> Bundle-Localization: plugin
> Bundle-Activator: com.lggi.esp.serviceimpl.ServiceImplBundleActivator
> Export-Package: com.lggi.esp.serviceimpl
> Import-Package: com.lggi.esp.serviceimpl,
> com.lggi.esp.osgi,
> com.lggi.esp.osgi.entity,
> com.lggi.esp.osgi.services,
> org.osgi.framework;version="1.3.0"
>
> I have validated that the jar file containing the bundle does in fact
> contain the class
"com.lggi.esp.serviceimpl.ServiceImplBundleActivator".
>
> When I go to deploy this bundle I get the following exception:
>
> 17:01:46,036 INFO [STDOUT] ---Starting up Felix OSGi Container 18---
> 17:01:46,192 INFO [STDOUT] Starting the BaseBundleActivator:
> 17:01:46,302 INFO [STDOUT] DEBUG: WIRE: 1.0 -> org.osgi.framework ->
0
> 17:01:46,302 INFO [STDOUT] Starting the ESP BaseBundleActivator:
> 17:01:46,302 INFO [STDOUT] DEBUG: WIRE: 2.0 ->
com.lggi.esp.serviceimpl
> -> 2.0
> 17:01:46,302 INFO [STDOUT] DEBUG: WIRE: 2.0 ->
> com.lggi.esp.osgi.services -> 0
> 17:01:46,302 INFO [STDOUT] DEBUG: WIRE: 2.0 -> org.osgi.framework ->
0
> 17:01:46,302 INFO [STDOUT] DEBUG: WIRE: 2.0 ->
com.lggi.esp.osgi.entity
> -> 0
> 17:01:46,302 INFO [STDOUT] DEBUG: WIRE: 2.0 -> com.lggi.esp.osgi ->
1.0
> 17:01:46,302 INFO [STDOUT] WARNING: *** Package
> 'com.lggi.esp.serviceimpl' is i
> mported by bundle 2 from bundle 2, but the exported package from
bundle
> 2 does n
> ot contain the requested class
> 'com.lggi.esp.serviceimpl.ServiceImplBundleActiva
> tor'. Please verify that the class name is correct in the importing
> bundle 2 and
> /or that the exported package is correctly bundled in 2. ***
> (java.lang.ClassNot
> FoundException: *** Package 'com.lggi.esp.serviceimpl' is imported by
> bundle 2 f
> rom bundle 2, but the exported package from bundle 2 does not contain
> the reques
> ted class 'com.lggi.esp.serviceimpl.ServiceImplBundleActivator'.
Please
> verify t
> hat the class name is correct in the importing bundle 2 and/or that
the
> exported
> package is correctly bundled in 2. ***)
> 17:01:46,302 INFO [STDOUT] ERROR: Error starting
> file:///D:\development\Brunswi
>
ck-Maven\spike\embedded-osgi\Leica-OSGi-ServiceImpl-Bundle\target\osgi-s
> ervice-i
> mpl-1.0.0.jar (org.osgi.framework.BundleException: Not found:
> com.lggi.esp.servi
> ceimpl.ServiceImplBundleActivator)
> 17:01:46,302 ERROR [STDERR] java.lang.ClassNotFoundException:
> com.lggi.esp.servi
> ceimpl.ServiceImplBundleActivator
> 17:01:46,302 ERROR [STDERR] at
> org.apache.felix.framework.Felix.createBundle
> Activator(Felix.java:3242)
> 17:01:46,302 ERROR [STDERR] at
> org.apache.felix.framework.Felix._startBundle
> (Felix.java:1304)
> 17:01:46,302 ERROR [STDERR] at
> org.apache.felix.framework.Felix.startBundle(
> Felix.java:1243)
> 17:01:46,302 ERROR [STDERR] at
> org.apache.felix.framework.Felix.setFramework
> StartLevel(Felix.java:838)
> 17:01:46,302 ERROR [STDERR] at
> org.apache.felix.framework.StartLevelImpl.run
> (StartLevelImpl.java:256)
> 17:01:46,302 ERROR [STDERR] at
java.lang.Thread.run(Thread.java:595)
> 17:01:46,317 INFO [STDOUT] value =
> osgi-server-ear-0.5/OSGiControllerBean/remot
> e
> 17:01:46,317 INFO [STDOUT] {JNDI NAME =
> osgi-server-ear-0.5/OSGiControllerBean/
> remote }
> 17:01:46,458 INFO [STDOUT] Total No of Bundles deployed
[EJBContainer]:
> [ 3 ]
> 17:01:46,458 INFO [STDOUT] Bundle Name => org.apache.felix.framework
> state => 3
> 2
> 17:01:46,458 INFO [STDOUT] Bundle Name => com.lggi.esp.osgi state =>
32
> 17:01:46,458 INFO [STDOUT] Bundle Name => com.lggi.esp.serviceimpl
> state => 4
>
>
> If I crack open the bundle, I can see the class at:
>
>
>
osgi-service-impl-1.0.0.jar\com\lggi\esp\serviceimpl\ServiceImplBundleAc
> tivator.class
>
>
> Any ideas on what is going on here?
>
> Regards,
> Todd
>
>
>