Unless you really need to embed Felix, why not run the Felix distribution and add something like Pax-Web which embeds Jetty to be your WAR/WAB web container?
On Thu, Jun 14, 2012 at 2:03 PM, Evan Ruff <[email protected]>wrote: > Hey guys, > > I'm just getting started with Felix and OSGi in general. I've > been cursing around trying to find some information about using Felix and > I've gotten stuck on the most trivial example! I think I must be missing > some sort of basic concept and I was hoping someone could tell me what I'm > doing wrong? > > For a little background, I'm trying to migrate a web-app to a more modular, > OSGi based, installable application. I want to distribute my application > and currently, that requires the administrator to set up a Jetty server and > install my Webapp. I'd much rather have a single application that contains > it's own Jetty server and then have the web-apps and their supporting J2EE > pieces be installed as OSGi modules. > > To start, I've created a new Java Project, added felix to the class path > and spun up the following main: > public static void main( String[] args ) throws BundleException > { > FrameworkFactory frameworkFactory = ServiceLoader.load( > FrameworkFactory.class ).iterator().next(); > Map<String, String> config = new HashMap<String, String>(); > Framework framework = frameworkFactory.newFramework( config ); > framework.start(); > BundleContext context = framework.getBundleContext(); > List<Bundle> installedBundles = new LinkedList<Bundle>(); > > installedBundles.add( context.installBundle( > "file:lib/org.apache.felix.http.bundle-2.2.0.jar" ) ); > installedBundles.add( context.installBundle( > "file:lib/org.apache.felix.log-1.0.1.jar" ) ); > installedBundles.add( context.installBundle( > "file:plugins/com.payPlum.HelloServlet_1.0.0.201206141509.jar" ) ); > > for ( Bundle bundle : installedBundles ) > { > System.out.println( "Starting Bundle: " + bundle.getSymbolicName() ); > bundle.start(); > } > } > > Which I pulled out of a tutorial about embedding Felix. > > I'm running into trouble when I get to the HelloServlet bundle. The > HelloServlet bundle is the simpliest thing I could write based off of the > HelloOSGi tutorials that were around. It's a pretty basic Activator, > registering the servlet as described in the Felix docs: > > public void start( BundleContext context ) throws Exception > { > ServiceReference<HttpService> sRef = context.getServiceReference( > HttpService.class ); > if (sRef != null) > { > HttpService service = (HttpService) context.getService( sRef ); > service.registerServlet( "/hello", new HelloServlet(), null, null ); > } > } > > The HelloServlet bundle has org.osgi.framework and org.osgi.service.http in > the "Import-Package" part of the manifest. > > When I run everything, I get a "Unable to resolve 4.0: missing requirement > [4.0] osgi.wiring.package; > (&(osgi.wiring.package=org.osgi.service.http)(version>=1.2.1))" exception > when starting the HelloServlet bundle. I assume this is because my Felix > container isn't registering th http-bundle properly. > > How do I get this sort of thing to work in an embedded scenario like this? > > FWIW, I had: config.put( Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, > "org.osgi.service.http; version=4.0.0" ); Iin there and, when that > happened, I was getting a NoClassDefFoundError NamespaceException, assuming > that it was looking for something other than the felix.http.bundle. > > I really appreciate any help you guys can give me. Thanks! > > E >

