users@glassfish.java.net

Re: Embed Apache Felix in a Web Application

From: <glassfish_at_javadesktop.org>
Date: Wed, 23 Jun 2010 15:08:00 PDT

Thanks very much Sahoo and Shing Wai Chan. With your help I'm able to get Felix HTTP Bridge running on Glassfish and register a simple Servlet deployed as a bundle.

For the history, the correct framework.properties is as follows:

######################################
org.osgi.framework.storage.clean=onFirstInit
org.osgi.framework.bundle.parent=framework
org.osgi.framework.system.packages.extra=javax.servlet, javax.servlet.http
felix.bootdelegation.implicit=true
felix.log.level=4
org.apache.felix.http.debug=true
osgi.shell.telnet.port=7789
#####################################

and the content of sun-web.xml is:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC '-//Sun Microsystems, Inc.//DTD
Application Server 9.0 Servlet 2.5//EN'
'http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd'>
<sun-web-app>
    <class-loader delegate="false" />
</sun-web-app>

Greetings,
Davide Boltri


> The delegate flag in sun-web.xml information can be
> found in
> http://docs.sun.com/app/docs/doc/820-7693/bearq?l=en&a
> =view
>
> Shing Wai Chan
>
> On 6/23/2010 7:18 AM, Sanjeeb Sahoo wrote:
> > I think I know what's going on here. Since
> GlassFish is already
> > running on top of Felix, when you are trying to
> load Felix, Felix
> > actually gets loaded by one of GlassFish class
> loader that's parent of
> > web app class loader. The class loader that loads
> Felix classes does
> > not really have visibility to Java EE APIs like
> javax.servlet. So,
> > even if you set
> >
> > org.osgi.framework.bundle.parent=framework
> >
> > it's not making any difference. You may like to
> launch Felix using a
> > custom class loader in OsgiManager.java:
> >
> > ClassLoader cl = new
> >
> ClassLoader(Thread.currentThread().getContextClassLoad
> er()) {
> > protected Class loadClass(String className)
> throws
> > ClassNotFoundException() {
> >
>
> f(className.startsWith("org.apache.felix")) {
> > URL url =
> >
> findResource(convertClassNameToResource(className));
> > if(url != null) {
> > byte[] bytes =
> readData(url);
> > defineClass(...);
> > }
> > }
> > return super.loadClass(className);
> > }
> > }
> >
> > Use this class to load org.apache.felix.main.Main
> and FrameworkFactory
> > class. I understand this is really not an elegant
> solution.
> >
> > An easier option is to switch off delegation flag
> in web app class
> > loader. You can do it by having a suitable
> sun-web.xml file in your
> > web app. Just google for it.
> >
> > I understand you don't want to depend on specific
> container behavior,
> > but can you detect that your code is running inside
> an OSGi enabled
> > container and use that instead of launching a new
> one? e.g., the code
> > below gets you a BundleContext object in glassfish:
> >
> > org.osgi.framework.BundleReference ref =
> >
> (BundleReference)javax.servlet.class.getClassLoader();
> > Bundle b = ref.getBundle();
> > BundleContext bctx = b.getBundleContext();
> > Use it to load your management bundle and pass
> control to it.
> >
> > Thanks,
> > Sahoo
> >
> > p.s: I have not really thought hard about this
> problem - so I am not
> > sure if all these will work or not in reality.
> >
[Message sent by forum member 'dboltri']

http://forums.java.net/jive/thread.jspa?messageID=475596