954,554 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

OSGI bundle starting problem

Hello, everyone!

I am unable to start a OSGI bundle. I'm using Apache Felix and this is my bundle:

1) Activator.java

package Example2;

import java.util.Properties;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

import Example2.Service.IDictionaryService;


/**
 * This is the bundle.
 * @author Pierre-Alexandre
 *
 */
public class Activator implements BundleActivator
{
	public Activator()
	{
		
	}
	
	@Override
	public void start(BundleContext context) throws Exception 
	{
		Properties props = new Properties();
		props.put("Language", "Hockey");
		context.registerService(IDictionaryService.class.getName(), new HockeyDictionary(), props);
	}

	@Override
	public void stop(BundleContext context) throws Exception
	{
	}

	/**
	 * This a private implementation of the IDictionaryService.
	 * @author Pierre-Alexandre
	 */
	private static class HockeyDictionary implements IDictionaryService
	{
		private String[] m_dictionary = { "kovalchuk", "crosby", "ovechkin", "malkin" };
		
		//-----------------------------------------------
		public boolean checkWord(String word) 
		{	
			for (String dictWord : m_dictionary)
			{
				if (word.equals(dictWord))
				{
					return true;
				}
			}
			
			return false;
		}
		
	}
}


2) IDictionaryService.java

package Example2.Service;

public interface IDictionaryService 
{
	public boolean checkWord(String word);
}


This is the manifest file that I'm using (it has a blank line at the end):

Bundle-Name: Hockey dictionary
Bundle-Description: A bundle that registers a hockey dictionary service
Bundle-Vendor: Apache Felix
Bundle-Version: 1.0.0
Bundle-Activator: Example2.Activator
Export-Package: Example2.Service
Import-Package: org.osgi.framework


Here are the commands that I enter:

This creates the .class files.

PS C:\Users\Pierre-Alexandre\workspace\ApacheFelixExample\src\Example2> javac -classpath '..\..\..\..\Documents\Études\U
niversité\Automne 2010\IFT697 - Projet\OSGI\felix-framework-3.0.2\bin\felix.jar' .\Activator.java .\Service\IDictionaryS
ervice.java

This creates the jar for launching the bundle.

PS C:\Users\Pierre-Alexandre\workspace\ApacheFelixExample\src\Example2> jar cfm example2.jar ./Service/manifest.mf './Ac
tivator$1.class' './Activator$HockeyDictionary.class' './Activator.class' ./Service/IDictionaryService.class

This installs and starts the bundle.

g! start file:/C:/Users/Pierre-Alexandre/workspace/ApacheFelixExample/src/Example2/example2.jar

This is the output I have:

org.osgi.framework.BundleException: Not found: Example2.Activator
at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:3657)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:1812)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1734)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:905)
at org.apache.felix.gogo.command.Basic.start(Basic.java:758)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.felix.gogo.runtime.Reflective.method(Reflective.java:136)
at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82)
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:421)
at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:335)
at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:184)
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:121)
at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:78)
at org.apache.felix.gogo.shell.Console.run(Console.java:62)
at org.apache.felix.gogo.shell.Shell.console(Shell.java:197)
at org.apache.felix.gogo.shell.Shell.gosh(Shell.java:123)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.felix.gogo.runtime.Reflective.method(Reflective.java:136)
at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82)
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:421)
at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:335)
at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:184)
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:121)
at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:78)
at org.apache.felix.gogo.shell.Activator.run(Activator.java:72)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: Example2.Activator
at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:772)
at org.apache.felix.framework.ModuleImpl.access$200(ModuleImpl.java:73)
at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1690)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:634)
at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:3653)
... 33 more
java.lang.ClassNotFoundException: Example2.Activator

After hours of debugging, I'm out of ideas. Is there someone who can point me what's wrong?

Thanks.

Edit: Note that all the paths are good. I have double and triple-checked their validity.

GDICommander
Posting Whiz in Training
211 posts since Jun 2008
Reputation Points: 72
Solved Threads: 26
 

I'm guessing its the manifest. lots out there if you google bunde-activator.

saw this:

Bundle-Activator: class-name

where class-name is a fully qualified Java classname

maybe your name isn't quite doing it with package.classname you have.

Mike

adams161
Posting Whiz in Training
281 posts since May 2008
Reputation Points: 31
Solved Threads: 27
 

I have verified the Bundle-Activator line in manifest.mf and unfortunately, it is ok. My Activator.class is in the Example2 package, according to the code I've posted.

I was thinking of a different loading order for .class files to see it if's the class loading for jar construction that, maybe, does not include the Activator class. I've tried to change the order and it does not work.

So, i'm still unable to make it work. Any other ideas?

GDICommander
Posting Whiz in Training
211 posts since Jun 2008
Reputation Points: 72
Solved Threads: 26
 

I finally solved my problem: the jar I was creating did not have a directory for the package inside. So, I enter this command:

PS C:\Users\Pierre-Alexandre\workspace\ApacheFelixExample\src> jar cfm ServiceExpositionExample.jar ServiceExpositionExa
mple\manifest.mf .\ServiceExpositionExample\*.class

And it works! Hope that this solution can help others.

GDICommander
Posting Whiz in Training
211 posts since Jun 2008
Reputation Points: 72
Solved Threads: 26
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You
View similar articles that have also been tagged: