Absolutely....
The bundle manifest:
Bundle-Name: English dictionary
Bundle-Description: A bundle that registers an English dictionary service
Bundle-Vendor: Apache Felix
Bundle-ClassPath: commons-lang-2.3.jar, .
Bundle-Version: 1.0.0
Bundle-Activator: com.bt.test.DictionaryActivator
Export-Package: com.bt.test
Import-Package: org.osgi.framework
adrian@adrian-small-laptop:/tmp/bundles$ jar tvf dictionaryBundle.jar
0 Mon Apr 04 12:57:10 BST 2011 META-INF/
424 Mon Apr 04 12:57:08 BST 2011 META-INF/MANIFEST.MF
0 Mon Apr 04 12:57:08 BST 2011 com/
0 Mon Apr 04 12:57:08 BST 2011 com/bt/
0 Mon Apr 04 12:57:08 BST 2011 com/bt/test/
1744 Mon Apr 04 12:57:08 BST 2011 com/bt/test/DictionaryActivator.class
882 Mon Apr 04 12:57:08 BST 2011 com/bt/test/DictionaryImpl.class
171 Mon Apr 04 12:57:08 BST 2011 com/bt/test/DictionaryService.class
245274 Tue Feb 13 18:32:02 GMT 2007 commons-lang-2.3.jar
The Main code:
package com.bt.test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import org.apache.felix.framework.util.FelixConstants;
import org.apache.felix.framework.util.Util;
import org.apache.felix.main.AutoProcessor;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.launch.Framework;
import org.osgi.framework.launch.FrameworkFactory;
public class Main {
public static final String BUNDLE_DIR_SWITCH = "-b";
public static final String SHUTDOWN_HOOK_PROP = "felix.shutdown.hook";
public static final String SYSTEM_PROPERTIES_PROP =
"felix.system.properties";
public static final String SYSTEM_PROPERTIES_FILE_VALUE =
"system.properties";
public static final String CONFIG_PROPERTIES_PROP =
"felix.config.properties";
public static final String CONFIG_PROPERTIES_FILE_VALUE =
"config.properties";
public static final String CONFIG_DIRECTORY = "conf";
private static Framework m_fwk = null;
public static void main(String[] args) throws Exception {
String bundleDir = null;
String cacheDir = null;
boolean expectBundleDir = false;
for (int i = 0; i < args.length; i++) {
if (args[i].equals(BUNDLE_DIR_SWITCH)) {
expectBundleDir = true;
} else if (expectBundleDir) {
bundleDir = args[i];
expectBundleDir = false;
} else {
cacheDir = args[i];
}
}
if ((args.length > 3) || (expectBundleDir && bundleDir ==
null)) {
System.out.println("Usage: [-b <bundle-deploy-dir>]
[<bundle-cache-dir>]");
System.exit(0);
}
Main.loadSystemProperties();
// Read configuration properties.
Properties configProps = Main.loadConfigProperties();
if (configProps == null) {
System.err.println("No " + CONFIG_PROPERTIES_FILE_VALUE
+ " found.");
configProps = new Properties();
}
Main.copySystemProperties(configProps);
if (bundleDir != null) {
configProps.setProperty(AutoProcessor.AUTO_DEPLOY_DIR_PROPERY, bundleDir);
}
if (cacheDir != null) {
configProps.setProperty(Constants.FRAMEWORK_STORAGE,
cacheDir);
}
String enableHook = configProps.getProperty(SHUTDOWN_HOOK_PROP);
if ((enableHook == null) ||
!enableHook.equalsIgnoreCase("false")) {
Runtime.getRuntime().addShutdownHook(
new Thread("Felix Shutdown Hook") {
public void run() {
try {
if (m_fwk !=
null) {
m_fwk.stop();
m_fwk.waitForStop(0);
}
} catch (Exception ex) {
System.err.println("Error stopping framework: " + ex);
}
}
});
}
configProps.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
"com.bt.test; version=1.0.0");
try {
HostActivator m_activator = new HostActivator();
List list = new ArrayList();
list.add(m_activator);
configProps.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list);
FrameworkFactory factory = getFrameworkFactory();
m_fwk = factory.newFramework(configProps);
m_fwk.init();
AutoProcessor.process(configProps,
m_fwk.getBundleContext());
m_fwk.start();
Bundle installBundle =
m_activator.getContext().installBundle(new
File("/tmp/bundles/dictionaryBundle.jar").toURL().toString());
installBundle.start();
ServiceReference serviceReference =
m_activator.getContext().getServiceReference(DictionaryService.class.getName());
Object object =
m_fwk.getBundleContext().getService(serviceReference);
DictionaryService service = (DictionaryService) object;
System.out.println("############################# " +
service.checkWord("osgi"));
System.out.println("############################# " +
service.checkWord("fred"));
m_fwk.waitForStop(0);
//System.exit(0);
} catch (Exception ex) {
System.err.println("Could not create framework: " + ex);
ex.printStackTrace();
System.exit(0);
}
}
private static FrameworkFactory getFrameworkFactory() throws Exception {
URL url =
Main.class.getClassLoader().getResource("META-INF/services/org.osgi.framework.launch.FrameworkFactory");
if (url != null) {
BufferedReader br = new BufferedReader(new
InputStreamReader(
url.openStream()));
try {
for (String s = br.readLine(); s != null; s =
br.readLine()) {
s = s.trim();
if ((s.length() > 0) && (s.charAt(0) !=
'#')) {
return (FrameworkFactory)
Class.forName(s).newInstance();
}
}
} finally {
if (br != null)
br.close();
}
}
throw new Exception("Could not find framework factory.");
}
public static void loadSystemProperties() {
URL propURL = null;
String custom = System.getProperty(SYSTEM_PROPERTIES_PROP);
if (custom != null) {
try {
propURL = new URL(custom);
} catch (MalformedURLException ex) {
System.err.print("Main: " + ex);
return;
}
} else {
File confDir = null;
String classpath =
System.getProperty("java.class.path");
int index =
classpath.toLowerCase().indexOf("felix.jar");
int start = classpath.lastIndexOf(File.pathSeparator,
index) + 1;
if (index >= start) {
String jarLocation = classpath.substring(start,
index);
confDir = new File(new File(new
File(jarLocation).getAbsolutePath()).getParent(), CONFIG_DIRECTORY);
} else {
confDir = new
File(System.getProperty("user.dir"), CONFIG_DIRECTORY);
}
try {
propURL = new File(confDir,
SYSTEM_PROPERTIES_FILE_VALUE).toURL();
} catch (MalformedURLException ex) {
System.err.print("Main: " + ex);
return;
}
}
Properties props = new Properties();
InputStream is = null;
try {
is = propURL.openConnection().getInputStream();
props.load(is);
is.close();
} catch (FileNotFoundException ex) {
// Ignore file not found.
} catch (Exception ex) {
System.err.println("Main: Error loading system
properties from " + propURL);
System.err.println("Main: " + ex);
try {
if (is != null)
is.close();
} catch (IOException ex2) {
// Nothing we can do.
}
return;
}
// Perform variable substitution on specified properties.
for (Enumeration e = props.propertyNames();
e.hasMoreElements();) {
String name = (String) e.nextElement();
System.setProperty(name,
Util.substVars(props.getProperty(name), name, null, null));
}
}
public static Properties loadConfigProperties() {
URL propURL = null;
String custom = System.getProperty(CONFIG_PROPERTIES_PROP);
if (custom != null) {
try {
propURL = new URL(custom);
} catch (MalformedURLException ex) {
System.err.print("Main: " + ex);
return null;
}
} else {
File confDir = null;
String classpath =
System.getProperty("java.class.path");
int index =
classpath.toLowerCase().indexOf("felix.jar");
int start = classpath.lastIndexOf(File.pathSeparator,
index) + 1;
if (index >= start) {
String jarLocation = classpath.substring(start,
index);
confDir = new File(new File(
new
File(jarLocation).getAbsolutePath()).getParent(),
CONFIG_DIRECTORY);
System.err.println(confDir.getAbsolutePath());
} else {
confDir = new
File(System.getProperty("user.dir"),
CONFIG_DIRECTORY);
}
try {
propURL = new File(confDir,
CONFIG_PROPERTIES_FILE_VALUE)
.toURL();
} catch (MalformedURLException ex) {
System.err.print("Main: " + ex);
return null;
}
}
Properties props = new Properties();
InputStream is = null;
try {
// Try to load config.properties.
is = propURL.openConnection().getInputStream();
props.load(is);
is.close();
} catch (Exception ex) {
// Try to close input stream if we have one.
try {
if (is != null)
is.close();
} catch (IOException ex2) {
// Nothing we can do.
}
return null;
}
for (Enumeration e = props.propertyNames();
e.hasMoreElements();) {
String name = (String) e.nextElement();
props.setProperty(name,
Util.substVars(props.getProperty(name),
name, null, props));
}
return props;
}
public static void copySystemProperties(Properties configProps) {
for (Enumeration e = System.getProperties().propertyNames(); e
.hasMoreElements();) {
String key = (String) e.nextElement();
if (key.startsWith("felix.")
||
key.startsWith("org.osgi.framework.")) {
configProps.setProperty(key,
System.getProperty(key));
}
}
}
}
-----Original Message-----
From: Richard S. Hall [mailto:[email protected]]
Sent: 04 April 2011 13:24
To: [email protected]
Subject: Re: NoClassDefFoundError when embedding felix
You're not really giving enough information. How about showing us your
manifest file and the contents of your bundle JAR file?
-> richard
On 4/4/11 7:35, [email protected] wrote:
> Hopefully someone can help me with this problem that is stopping me from
> progressing with Felix ?
>
> I have a simple bundle based on the example DictionaryBundle in the examples
> with the added complexity of an embedded jar file, is this case
> commons-lang.jar.
>
> I can install and start the bundle into Felix when it is run from the command
> line (java -jar bin/felix.jar) and I can see the embedded jar being extracted
> in the felix-cache directory etc. In by Activator.start() method I also
> invoke the bundle code to prove that it works OK.
>
> If I write some other code, closely following the patterns described at
> http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html#ApacheFelixFrameworkLaunchingandEmbedding-embedding,
> I find that, when the bundle is started, I get an error:
>
> Could not create framework: org.osgi.framework.BundleException: Activator
> start error in bundle [5].
> [java] org.osgi.framework.BundleException: Activator start error in
> bundle [5].
> [java] at
> org.apache.felix.framework.Felix.activateBundle(Felix.java:1899)
> [java] at
> org.apache.felix.framework.Felix.startBundle(Felix.java:1769)
> [java] at
> org.apache.felix.framework.BundleImpl.start(BundleImpl.java:927)
> [java] at com.bt.test.Main.main(Main.java:298)
> [java] Caused by: java.lang.NoClassDefFoundError:
> org/apache/commons/lang/StringUtils
> [java] at
> com.bt.test.DictionaryImpl.checkWord(DictionaryImpl.java:24)
> [java] at
> com.bt.test.DictionaryActivator.start(DictionaryActivator.java:33)
> [java] at
> org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:629)
> [java] at
> org.apache.felix.framework.Felix.activateBundle(Felix.java:1852)
> [java] ... 3 more
> [java]
>
> I have studied the Main class from the Felix jar for differences to my code
> and cannot find anything obvious. Any clues appreciated.
>
> Thanks
>
> Adrian Smith
> BT Group
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]