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.
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
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?
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.