Jeremy,

On 5/2/23 22:27, Jeremy Nguyen wrote:
I was able to retrieve some logs that might shed some insight on the
parent classloader when running 8.5.87. I'll be frank that I don't quite
understand the mechanics of classloaders in Java.

LogFactory from
org.eclipse.osgi.internal.loader.EquinoxClassLoader@1628551735] [LOOKUP]
LogFactory implementation requested for the first time for context
classloader org.apache.catalina.loader.ParallelWebappClassLoader@1204822967

[LogFactory from
org.eclipse.osgi.internal.loader.EquinoxClassLoader@1628551735] [LOOKUP]
org.apache.catalina.loader.ParallelWebappClassLoader@1204822967 ==
'ParallelWebappClassLoader

context: cg

delegate: false

----------> Parent Classloader:

org.cg.dao.webcontainer.tomcat.WebAppClassLoader@b887730

I wonder if org.cg.dao.webcontainer.tomcat.WebAppClassLoader has a bug where getResources() can return null.

That violates the contract of ClassLoader.getResources, but since it's /possible/ maybe Tomcat can work around it by simply ignoring the empty Enumeration. If I give you an unofficial build, can you try it?

-chris

[LogFactory from
org.eclipse.osgi.internal.loader.EquinoxClassLoader@1628551735] [LOOKUP]
ClassLoader
tree:org.apache.catalina.loader.ParallelWebappClassLoader@1204822967 -->
org.cg.dao.webcontainer.tomcat.WebAppClassLoader@193492784 -->
jdk.internal.loader.ClassLoaders$AppClassLoader@2085857771 (SYSTEM) -->
jdk.internal.loader.ClassLoaders$PlatformClassLoader@105966264 --> BOOT

May 02, 2023 7:23:21 PM org.apache.catalina.core.StandardContext
listenerStart

SEVERE: Exception sending context initialized event to listener instance
of class [org.springframework.web.context.ContextLoaderListener]

java.lang.NullPointerException

at
org.apache.catalina.loader.WebappClassLoaderBase$CombinedEnumeration.inc(
WebappClassLoaderBase.java:2775)

at
org.apache.catalina.loader.WebappClassLoaderBase$CombinedEnumeration.hasMoreElements(
WebappClassLoaderBase.java:2760)

at org.apache.commons.logging.LogFactory.getConfigurationFile(
LogFactory.java:1366)

at org.apache.commons.logging.LogFactory.getFactory(LogFactory.java:453)

at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:655)

at org.springframework.web.context.ContextLoader.initWebApplicationContext(
ContextLoader.java:269)

at
org.springframework.web.context.ContextLoaderListener.contextInitialized(
ContextLoaderListener.java:103)

at org.apache.catalina.core.StandardContext.listenerStart(
StandardContext.java:4492)

at org.apache.catalina.core.StandardContext.startInternal(
StandardContext.java:4950)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)

at org.apache.catalina.core.ContainerBase.addChildInternal(
ContainerBase.java:711)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:688)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:661)

at org.cg.dao.webcontainer.tomcat.TomcatWrapper.startWebApp(
TomcatWrapper.java:185)

at org.cg.dao.webcontainer.tomcat.TomcatWrapper.prepareAllWebApps(
TomcatWrapper.java:140)

at org.cg.dao.webcontainer.tomcat.TomcatWrapper.startServer(
TomcatWrapper.java:206)

at org.cg.dao.webcontainer.tomcat.Application.start(Application.java:30)

at org.eclipse.equinox.internal.app.EclipseAppHandle.run(
EclipseAppHandle.java:203)

at
org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(
EclipseAppLauncher.java:136)

at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(
EclipseAppLauncher.java:104)

at org.eclipse.core.runtime.adaptor.EclipseStarter.run(
EclipseStarter.java:402)

at org.eclipse.core.runtime.adaptor.EclipseStarter.run(
EclipseStarter.java:255)

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(
NativeMethodAccessorImpl.java:62)

at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(
DelegatingMethodAccessorImpl.java:43)

at java.base/java.lang.reflect.Method.invoke(Method.java:566)

at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659)

at org.eclipse.equinox.launcher.Main.basicRun(Main.java:596)

at org.eclipse.equinox.launcher.Main.run(Main.java:1467)

at org.eclipse.equinox.launcher.Main.main(Main.java:1440)


On Tue, May 2, 2023 at 6:18 PM Jeremy Nguyen <jeremyn...@gmail.com> wrote:

  I picked 8.5.34 because 8.5.35 has that code change while 34 doesn't.
https://github.com/apache/tomcat/blob/8.5.35/java/org/apache/catalina/loader/WebappClassLoaderBase.java#L1050

I'll do some debugging for the classloader soon. I'm still trying to get
my application running. I'm wrestling with the following error at runtime.

Caused by: org.apache.jasper.JasperException: Unable to compile class for
JSP
at
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:610)
~[jasper.jar:8.5.34]
at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:382)
~[jasper.jar:8.5.34]
at
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
~[jasper.jar:8.5.34]
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
~[jasper.jar:8.5.34]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
~[servlet-api.jar:?]
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
~[catalina.jar:8.5.34]
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
~[catalina.jar:8.5.34]
at
com.centrify.platform.service.analytics.filter.GlobalAttributeFilter.doFilter(GlobalAttributeFilter.java:41)
~[com.centrify.platform.service.analytics/:?]
at
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
~[spring-web-5.1.20.RELEASE.jar:5.1.20.RELEASE]
at
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)
~[spring-web-5.1.20.RELEASE.jar:5.1.20.RELEASE]
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
~[catalina.jar:8.5.34]
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
~[catalina.jar:8.5.34]
at
org.cg.services.core.filter.ExecutionTimeFilter.doFilterInternal(ExecutionTimeFilter.java:29)
~[org.cg.services.core/:?]
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
~[spring-web-5.1.20.RELEASE.jar:5.1.20.RELEASE]
at
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
~[spring-web-5.1.20.RELEASE.jar:5.1.20.RELEASE]
at
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)
~[spring-web-5.1.20.RELEASE.jar:5.1.20.RELEASE]
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
~[catalina.jar:8.5.34]
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
~[catalina.jar:8.5.34]
at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:112)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.pac4j.springframework.security.web.SecurityFilter.lambda$doFilter$1(SecurityFilter.java:52)
~[spring-security-pac4j-2.0.0.jar:?]
at
org.pac4j.core.engine.DefaultSecurityLogic.perform(DefaultSecurityLogic.java:136)
~[pac4j-core-1.9.1.jar:?]
... 34 more
Caused by: java.lang.NullPointerException
at
org.apache.jasper.compiler.Validator$ValidateVisitor.<init>(Validator.java:516)
~[jasper.jar:8.5.34]
at
org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1854)
~[jasper.jar:8.5.34]
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:220)
~[jasper.jar:8.5.34]
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
~[jasper.jar:8.5.34]
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:350)
~[jasper.jar:8.5.34]
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:334)
~[jasper.jar:8.5.34]
at
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:595)
~[jasper.jar:8.5.34]
at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:382)
~[jasper.jar:8.5.34]
at
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
~[jasper.jar:8.5.34]
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
~[jasper.jar:8.5.34]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
~[servlet-api.jar:?]
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
~[catalina.jar:8.5.34]
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
~[catalina.jar:8.5.34]
at
com.centrify.platform.service.analytics.filter.GlobalAttributeFilter.doFilter(GlobalAttributeFilter.java:41)
~[com.centrify.platform.service.analytics/:?]
at
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
~[spring-web-5.1.20.RELEASE.jar:5.1.20.RELEASE]
at
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)
~[spring-web-5.1.20.RELEASE.jar:5.1.20.RELEASE]
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
~[catalina.jar:8.5.34]
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
~[catalina.jar:8.5.34]
at
org.cg.services.core.filter.ExecutionTimeFilter.doFilterInternal(ExecutionTimeFilter.java:29)
~[org.cg.services.core/:?]
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
~[spring-web-5.1.20.RELEASE.jar:5.1.20.RELEASE]
at
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
~[spring-web-5.1.20.RELEASE.jar:5.1.20.RELEASE]
at
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)
~[spring-web-5.1.20.RELEASE.jar:5.1.20.RELEASE]
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
~[catalina.jar:8.5.34]
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
~[catalina.jar:8.5.34]
at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:112)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
~[spring-security-web-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at
org.pac4j.springframework.security.web.SecurityFilter.lambda$doFilter$1(SecurityFilter.java:52)
~[spring-security-pac4j-2.0.0.jar:?]
at
org.pac4j.core.engine.DefaultSecurityLogic.perform(DefaultSecurityLogic.java:136)
~[pac4j-core-1.9.1.jar:?]
... 34 more


On Tue, May 2, 2023 at 5:23 AM Christopher Schultz <
ch...@christopherschultz.net> wrote:

Jeremy,

On 5/1/23 17:46, Jeremy Nguyen wrote:
I noticed this change was introduced:
https://bz.apache.org/bugzilla/show_bug.cgi?id=62868

https://github.com/apache/tomcat/blame/8.5.x/java/org/apache/catalina/loader/WebappClassLoaderBase.java#L1122

I'll try running 8.5.34 and report back.

Wow that's ancient. What made you pick 8.5.34? That change should have
gone into 8.5.36. Can you try both 8.5.35 and 8.5.36 and let us know
which (if either) works?

I wonder if the parent ClassLoader is violating the contract for
getResources().

Jeremy, can you throw some code into your application that runs early
(like in org.cg.dao.webcontainer.tomcat.TomcatWrapper.startWebApp) that
reports the class name of thew parent ClassLoader for the
WebappClassLoader being used for the webapp?

If you aren't able to do that -- and since you are running from Eclipse
-- try putting a breakpoint in WebappClassLoaderBase.getResources
   and just inspecting the situation at that point -- you should be able
to see what the parent ClassLoader is, and even see what
getParent().getResources() returns.

-chris

On Mon, May 1, 2023 at 2:12 PM Rob Sargent <rsarg...@xmission.com>
wrote:



On 5/1/23 14:36, Christopher Schultz wrote:
Jeremy,

On 5/1/23 14:22, Jeremy Nguyen wrote:
I'm trying to upgrade Tomcat 8 to 8.5 and I'm getting a
nullpointerexception within
WebappClassLoaderBase.CombinedEnumeration.inc.
It seems to occur when it's trying to initialize commons-logging
LogFactory
for any class specified in Web.xml, and it's calling
getResources("commons-logging.properties") which I never had. Is it
required in 8.5? Even if I put it in conf/, it's not being picked up.

We're running Tomcat using a wrapper and it's erroring out here:


https://github.com/CodeGerm/osgi-server/blob/master/plugins/org.cg.dao.webcontainer/src/org/cg/dao/webcontainer/tomcat/TomcatWrapper.java#L185


I posted my web.xml and error trace here as well:


https://stackoverflow.com/questions/76139108/web-xml-configuration-is-broken-when-upgrading-to-tomcat-8-5-and-spring-5-1


I have no idea how this is throwing an NPE. The only pointer being
dereferenced by the inc() method is "sources":

2773        private boolean inc() {
2774            while (index < sources.length) {
2775                if (sources[index].hasMoreElements()) {
2776                    return true;
2777                }
2778                index++;
2779            }
2780            return false;
2781        }

That member (sources) is instantiated in the one-and-only-one
constructor:

          CombinedEnumeration(Enumeration<URL> enum1, Enumeration<URL>
enum2) {
              @SuppressWarnings("unchecked")
              Enumeration<URL>[] sources = new Enumeration[] { enum1,
enum2 };
              this.sources = sources;
          }

Also weird is that this throws NPE on line 2775 and not 2774. I can't
explain how line 2775 could throw an NPE if line 2774 did not.

:/

Is the null pointer in the index'th position of source, not source
itself?


I use Tomcat 8.5.x and I have never had a commons-logging.properties
file, and I use some components which are surely causing
commons-logging LogFactory to initialize, and I've never seen this
problem before.

-chris

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



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




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




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

Reply via email to