You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Behrooz Nobakht <no...@gmail.com> on 2018/03/26 04:26:05 UTC

Tomcat 8.0.38 to 9.0.6 -- Default Class Loader and Naming InitialContext

Hi,

I am migrating a code base from Tomcat 8.0.38 to 9.0.6. There are a few
things
I'd like to confirm based on observations so far and ask for advice:

1. Default Class Loader

In 9, it seems that the default is ParallelWebAppClassLoader compared with
WebAppClassLoader in 8.0.
What behavior changes does the new class loader bring esp. now that it
seems to use "concurrent" approach?

One specific observation so far is that the code

Thread.currentThread().getContextClassLoader()

used to give out "a" class loader in 8.0 but it returns null in 9.0.
Any advice on this?

2. ClassNotFoundException: org.apache.naming.java.javaURLContextFactory

Having the code:

InitialContext ic = new InitialContext()

used to work on Tomcat 8.0 but now yields the above exception in Tomcat 9.
It seems that catalina.jar is not exposed by default to a webapp class
loader.
Is this correct? What needs to be configured to fix this?

Thanks in advance!
Behrooz

Re: Tomcat 8.0.38 to 9.0.6 -- Default Class Loader and Naming InitialContext

Posted by Behrooz Nobakht <no...@gmail.com>.
Managed to narrow down to a regression:
https://bz.apache.org/bugzilla/show_bug.cgi?id=62224

On Tue, Mar 27, 2018 at 2:09 PM, Behrooz Nobakht <no...@gmail.com> wrote:

> Hi Chris,
>
> Thanks for the reply. Comments inline:
>
> On Tue, Mar 27, 2018 at 4:31 AM, Christopher Schultz <
> chris@christopherschultz.net> wrote:
>
>> -----BEGIN PGP SIGNED MESSAGE-----
>> Hash: SHA256
>>
>> Behrooz,
>>
>> On 3/26/18 12:26 AM, Behrooz Nobakht wrote:
>> > Hi,
>> >
>> > I am migrating a code base from Tomcat 8.0.38 to 9.0.6. There are a
>> > few things I'd like to confirm based on observations so far and ask
>> > for advice:
>> >
>> > 1. Default Class Loader
>> >
>> > In 9, it seems that the default is ParallelWebAppClassLoader
>> > compared with WebAppClassLoader in 8.0. What behavior changes does
>> > the new class loader bring esp. now that it seems to use
>> > "concurrent" approach?
>> >
>> > One specific observation so far is that the code
>> >
>> > Thread.currentThread().getContextClassLoader()
>> >
>> > used to give out "a" class loader in 8.0 but it returns null in
>> > 9.0. Any advice on this?
>>
>> What code is fetching the TCCL? Something like a ServletContextListener?
>>
>
> This is a business object trying to resolve a resource using
> ClassLoader#gerResource
> and class loader is retrieved via above way. The call stack comes from a
> REST request
> and it's not part of container/context life cycle.
>
>
>>
>> > 2. ClassNotFoundException:
>> > org.apache.naming.java.javaURLContextFactory
>> >
>> > Having the code:
>> >
>> > InitialContext ic = new InitialContext()
>>
>> What data type is InitialContext in your code, here? Can you post the
>> complete stack trace?
>>
>
> InitialContext is javax.naming.InitialContext.
> As I traced this, by default this is enabled by Tomcat itself at
> Catalina.java
> <https://github.com/apache/tomcat/blob/trunk/java/org/apache/catalina/startup/Catalina.java#L823>
> .
> We might be having implicit class loader conflicts which I am tracing now.
> I event tried to install a custom Loader
> <http://tomcat.apache.org/tomcat-9.0-doc/config/loader.html> inside the
> Context with WebappClassLoader
> to see anything changes in comparison with ParallelWebappClassLoader.
> Tomcat 8 works but Tomcat 9 fails with ClassNotFoundException:
>
> javax.naming.NoInitialContextException: Cannot instantiate class:
> org.apache.naming.java.javaURLContextFactory [Root exception is java.lang.ClassNotFoundException:
> org.apache.naming.java.javaURLContextFactory]
>     at javax.naming.spi.NamingManager.getInitialContext(
> NamingManager.java:674)
>     at javax.naming.InitialContext.getDefaultInitCtx(
> InitialContext.java:313)
>     at javax.naming.InitialContext.init(InitialContext.java:244)
>     at javax.naming.InitialContext.<init>(InitialContext.java:192)
>
> And, we're not explicitly bundling tomcat-catalina.jar with the webapp.
>
> Thanks,
> Behrooz
>
>
>
>>
>> > used to work on Tomcat 8.0 but now yields the above exception in
>> > Tomcat 9. It seems that catalina.jar is not exposed by default to a
>> > webapp class loader.
>>
>> Nor should it. It should not have been available to applications in
>> Tomcat 8, either. Are you bundling catalina.jar with your application?
>>
>> - -chris
>> -----BEGIN PGP SIGNATURE-----
>> Comment: GPGTools - http://gpgtools.org
>> Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
>>
>> iQJRBAEBCAA7FiEEMmKgYcQvxMe7tcJcHPApP6U8pFgFAlq5LncdHGNocmlzQGNo
>> cmlzdG9waGVyc2NodWx0ei5uZXQACgkQHPApP6U8pFhSiBAArOCcZ0okwbEp1ag+
>> gCJw3jXcndN3JfmcEoIjNddR8/P2BvGSpZrvNX3b/hECrmlMV7hUl0SpORl7afL5
>> zrP1liEdRlZ50EmpQJULG+yjktc298Ip6eXWQLa6oX9OOLbkZyknlGeI249j6syo
>> FXomtb6ZQ4F0WP9wC14N/keAHL2nqTOk7+1p1khfIYPVUM1MfT9EtVnW3weL9kHd
>> sn1FZIV3TNkOiukQm9znIeed00YlH0kaS2V9l/GNOvkhwH66xROxiJukm3dUzTQe
>> djsigv/mHrEWZDG9rhteJbt9RB6XMsaQogfXh8JlZsfxt2i7Yy12O2LOOHFIMaTl
>> 4fjKxiuQl0iOi52rfvrp+CTO/0y0TklPh3gYcNa2dpZm/UGkLrRty199Qs9+KIgy
>> d0L5zT9pwFusTwKt/wiVyGcm+Jg2Lq13fD8WNMmElk1h78ceVbM3NFDxZqqaSHK2
>> p3S3xrMsTeFfyFI2BRdUXlV/+HGwwLYnmHWPVSEUhV448WXdOd0kehYSJGLmfXBM
>> UrYiZksVTYjsJc5zCADtp4xNm/At9T/Ktcfp67Rm97bR8ityQBuf9xKpJ7eo5Gzj
>> Ecl4kFz2W4sRxli0H5zX8lcoO7A9AAk7P0bR1ooMZ/8d6nx1WrIx19zNXz1ou8me
>> qI6/uYGGZX23quqgKXKP9g2basE=
>> =DOWh
>> -----END PGP SIGNATURE-----
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>> For additional commands, e-mail: users-help@tomcat.apache.org
>>
>>
>
>
> --
> -- Behrooz Nobakht
>



-- 
-- Behrooz Nobakht

Re: Tomcat 8.0.38 to 9.0.6 -- Default Class Loader and Naming InitialContext

Posted by Behrooz Nobakht <no...@gmail.com>.
Hi Chris,

Thanks for the reply. Comments inline:

On Tue, Mar 27, 2018 at 4:31 AM, Christopher Schultz <
chris@christopherschultz.net> wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA256
>
> Behrooz,
>
> On 3/26/18 12:26 AM, Behrooz Nobakht wrote:
> > Hi,
> >
> > I am migrating a code base from Tomcat 8.0.38 to 9.0.6. There are a
> > few things I'd like to confirm based on observations so far and ask
> > for advice:
> >
> > 1. Default Class Loader
> >
> > In 9, it seems that the default is ParallelWebAppClassLoader
> > compared with WebAppClassLoader in 8.0. What behavior changes does
> > the new class loader bring esp. now that it seems to use
> > "concurrent" approach?
> >
> > One specific observation so far is that the code
> >
> > Thread.currentThread().getContextClassLoader()
> >
> > used to give out "a" class loader in 8.0 but it returns null in
> > 9.0. Any advice on this?
>
> What code is fetching the TCCL? Something like a ServletContextListener?
>

This is a business object trying to resolve a resource using
ClassLoader#gerResource
and class loader is retrieved via above way. The call stack comes from a
REST request
and it's not part of container/context life cycle.


>
> > 2. ClassNotFoundException:
> > org.apache.naming.java.javaURLContextFactory
> >
> > Having the code:
> >
> > InitialContext ic = new InitialContext()
>
> What data type is InitialContext in your code, here? Can you post the
> complete stack trace?
>

InitialContext is javax.naming.InitialContext.
As I traced this, by default this is enabled by Tomcat itself at
Catalina.java
<https://github.com/apache/tomcat/blob/trunk/java/org/apache/catalina/startup/Catalina.java#L823>
.
We might be having implicit class loader conflicts which I am tracing now.
I event tried to install a custom Loader
<http://tomcat.apache.org/tomcat-9.0-doc/config/loader.html> inside the
Context with WebappClassLoader
to see anything changes in comparison with ParallelWebappClassLoader.
Tomcat 8 works but Tomcat 9 fails with ClassNotFoundException:

javax.naming.NoInitialContextException: Cannot instantiate class:
org.apache.naming.java.javaURLContextFactory [Root exception is
java.lang.ClassNotFoundException:
org.apache.naming.java.javaURLContextFactory]
    at
javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:674)
    at
javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
    at javax.naming.InitialContext.init(InitialContext.java:244)
    at javax.naming.InitialContext.<init>(InitialContext.java:192)

And, we're not explicitly bundling tomcat-catalina.jar with the webapp.

Thanks,
Behrooz



>
> > used to work on Tomcat 8.0 but now yields the above exception in
> > Tomcat 9. It seems that catalina.jar is not exposed by default to a
> > webapp class loader.
>
> Nor should it. It should not have been available to applications in
> Tomcat 8, either. Are you bundling catalina.jar with your application?
>
> - -chris
> -----BEGIN PGP SIGNATURE-----
> Comment: GPGTools - http://gpgtools.org
> Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
>
> iQJRBAEBCAA7FiEEMmKgYcQvxMe7tcJcHPApP6U8pFgFAlq5LncdHGNocmlzQGNo
> cmlzdG9waGVyc2NodWx0ei5uZXQACgkQHPApP6U8pFhSiBAArOCcZ0okwbEp1ag+
> gCJw3jXcndN3JfmcEoIjNddR8/P2BvGSpZrvNX3b/hECrmlMV7hUl0SpORl7afL5
> zrP1liEdRlZ50EmpQJULG+yjktc298Ip6eXWQLa6oX9OOLbkZyknlGeI249j6syo
> FXomtb6ZQ4F0WP9wC14N/keAHL2nqTOk7+1p1khfIYPVUM1MfT9EtVnW3weL9kHd
> sn1FZIV3TNkOiukQm9znIeed00YlH0kaS2V9l/GNOvkhwH66xROxiJukm3dUzTQe
> djsigv/mHrEWZDG9rhteJbt9RB6XMsaQogfXh8JlZsfxt2i7Yy12O2LOOHFIMaTl
> 4fjKxiuQl0iOi52rfvrp+CTO/0y0TklPh3gYcNa2dpZm/UGkLrRty199Qs9+KIgy
> d0L5zT9pwFusTwKt/wiVyGcm+Jg2Lq13fD8WNMmElk1h78ceVbM3NFDxZqqaSHK2
> p3S3xrMsTeFfyFI2BRdUXlV/+HGwwLYnmHWPVSEUhV448WXdOd0kehYSJGLmfXBM
> UrYiZksVTYjsJc5zCADtp4xNm/At9T/Ktcfp67Rm97bR8ityQBuf9xKpJ7eo5Gzj
> Ecl4kFz2W4sRxli0H5zX8lcoO7A9AAk7P0bR1ooMZ/8d6nx1WrIx19zNXz1ou8me
> qI6/uYGGZX23quqgKXKP9g2basE=
> =DOWh
> -----END PGP SIGNATURE-----
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
>
>


-- 
-- Behrooz Nobakht

Re: Tomcat 8.0.38 to 9.0.6 -- Default Class Loader and Naming InitialContext

Posted by Christopher Schultz <ch...@christopherschultz.net>.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Behrooz,

On 3/26/18 12:26 AM, Behrooz Nobakht wrote:
> Hi,
> 
> I am migrating a code base from Tomcat 8.0.38 to 9.0.6. There are a
> few things I'd like to confirm based on observations so far and ask
> for advice:
> 
> 1. Default Class Loader
> 
> In 9, it seems that the default is ParallelWebAppClassLoader
> compared with WebAppClassLoader in 8.0. What behavior changes does
> the new class loader bring esp. now that it seems to use
> "concurrent" approach?
> 
> One specific observation so far is that the code
> 
> Thread.currentThread().getContextClassLoader()
> 
> used to give out "a" class loader in 8.0 but it returns null in
> 9.0. Any advice on this?

What code is fetching the TCCL? Something like a ServletContextListener?

> 2. ClassNotFoundException:
> org.apache.naming.java.javaURLContextFactory
> 
> Having the code:
> 
> InitialContext ic = new InitialContext()

What data type is InitialContext in your code, here? Can you post the
complete stack trace?

> used to work on Tomcat 8.0 but now yields the above exception in
> Tomcat 9. It seems that catalina.jar is not exposed by default to a
> webapp class loader.

Nor should it. It should not have been available to applications in
Tomcat 8, either. Are you bundling catalina.jar with your application?

- -chris
-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - http://gpgtools.org
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQJRBAEBCAA7FiEEMmKgYcQvxMe7tcJcHPApP6U8pFgFAlq5LncdHGNocmlzQGNo
cmlzdG9waGVyc2NodWx0ei5uZXQACgkQHPApP6U8pFhSiBAArOCcZ0okwbEp1ag+
gCJw3jXcndN3JfmcEoIjNddR8/P2BvGSpZrvNX3b/hECrmlMV7hUl0SpORl7afL5
zrP1liEdRlZ50EmpQJULG+yjktc298Ip6eXWQLa6oX9OOLbkZyknlGeI249j6syo
FXomtb6ZQ4F0WP9wC14N/keAHL2nqTOk7+1p1khfIYPVUM1MfT9EtVnW3weL9kHd
sn1FZIV3TNkOiukQm9znIeed00YlH0kaS2V9l/GNOvkhwH66xROxiJukm3dUzTQe
djsigv/mHrEWZDG9rhteJbt9RB6XMsaQogfXh8JlZsfxt2i7Yy12O2LOOHFIMaTl
4fjKxiuQl0iOi52rfvrp+CTO/0y0TklPh3gYcNa2dpZm/UGkLrRty199Qs9+KIgy
d0L5zT9pwFusTwKt/wiVyGcm+Jg2Lq13fD8WNMmElk1h78ceVbM3NFDxZqqaSHK2
p3S3xrMsTeFfyFI2BRdUXlV/+HGwwLYnmHWPVSEUhV448WXdOd0kehYSJGLmfXBM
UrYiZksVTYjsJc5zCADtp4xNm/At9T/Ktcfp67Rm97bR8ityQBuf9xKpJ7eo5Gzj
Ecl4kFz2W4sRxli0H5zX8lcoO7A9AAk7P0bR1ooMZ/8d6nx1WrIx19zNXz1ou8me
qI6/uYGGZX23quqgKXKP9g2basE=
=DOWh
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org