Symlinking a jar into WEB-INF/lib results in a NullPointerException during scanning for web fragments: Caused by: java.lang.NullPointerException at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:382) at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:195) at org.apache.catalina.startup.ContextConfig.processJarsForWebFragments(ContextConfig.java:2136) at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1289) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:986) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:303) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5135) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ... 38 more This behaviour can be reproduced with the following steps: wget https://apache.mirrors.nublue.co.uk/tomcat/tomcat-9/v9.0.48/bin/apache-tomcat-9.0.48.tar.gz tar -xzf apache-tomcat-9.0.48.tar.gz mkdir -p apache-tomcat-9.0.48/webapps/symlink-problem/WEB-INF/lib wget https://repo.spring.io/artifactory/libs-release-local/org/springframework/cloud/spring-cloud-bindings/1.7.1/spring-cloud-bindings-1.7.1.jar ln -s spring-cloud-bindings-1.7.1.jar apache-tomcat-9.0.48/webapps/symlink-problem/WEB-INF/lib apache-tomcat-9.0.48/bin/catalina.sh run I don't believe that the specific jar that's symlinked is important, any jar will reproduce the failure. The problem also occurs with <Resources allowLinking="true"/> added to conf/context.xml. We've also seen a similar problem with embedded Tomcat when scanning for tag libraries. Please see https://github.com/spring-projects/spring-boot/issues/27075 for some further details.
I can confirm that linking any JAR does appear to trigger this. My testing with both main (10.1.x) and 9.0.x is that adding: <Resources allowLinking="true" /> to conf/context.xml does work around the issue. I don't recall any recent changes to resource handling that would explain why this works for me but not for you.
Thanks for the report. Fixed in: - 10.1.x for 10.1.0-M2 onwards - 10.0.x for 10.0.8 onwards - 9.0.x for 9.0.49 onwards - 8.5.x for 8.5.69 onwards
Hi, sorry, but I do not think this is completely fixed. When moving from 9.0.48 to 9.0.50, we get a nasty stack trace that is cured by adding <Resources allowLinking="true" /> There is definitely no warning about a mis-configuration as I would have expected from the 9.0.49 change log entry. We are using symbolic links on a few levels of our installation. There is no symbolic linking directly in WEB-INF/lib. So it seems to be somewhere else. Shall I open an new report? At the moment I do not have an easy reproducer. 18-Jul-2021 14:06:07.991 INFO [main] org.apache.myfaces.config.DefaultFacesConfigurationProvider.getClassloaderFacesConfig Reading config : jar:file:/net/ltsdm01/fs1/cb2/Portals/smgr2021.2 -GA-final-r10889/apache-tomcat-9.0.50/webapps/cb2/WEB-INF/lib/richfaces-a4j-4.5.1.Final.jar!/META-INF/behaviors-handler-delegate.faces-config.xml 18-Jul-2021 14:06:07.992 INFO [main] org.apache.myfaces.config.DefaultFacesConfigurationProvider.getContextSpecifiedFacesConfig Reading config /WEB-INF/sdm-facelets-config.xml 18-Jul-2021 14:06:08.024 SEVERE [main] org.apache.myfaces.webapp.AbstractFacesInitializer.initFaces An error occured while initializing MyFaces: String index out of range: -25 java.lang.StringIndexOutOfBoundsException: String index out of range: -25 at java.base/java.lang.String.substring(String.java:1841) at org.apache.catalina.webresources.DirResourceSet.listWebAppPaths(DirResourceSet.java:175) at org.apache.catalina.webresources.StandardRoot.listWebAppPaths(StandardRoot.java:149) at org.apache.catalina.core.ApplicationContext.getResourcePaths(ApplicationContext.java:602) at org.apache.catalina.core.ApplicationContextFacade.getResourcePaths(ApplicationContextFacade.java:183) at org.apache.myfaces.context.servlet.ServletExternalContextImplBase.getResourcePaths(ServletExternalContextImplBase.java:142) at org.apache.myfaces.config.DefaultFacesConfigurationProvider.getFacesFlowFacesConfig(DefaultFacesConfigurationProvider.java:583) at org.apache.myfaces.config.DefaultFacesConfigurationMerger.getFacesConfigData(DefaultFacesConfigurationMerger.java:111) at org.apache.myfaces.config.FacesConfigurator.configure(FacesConfigurator.java:474) at org.apache.myfaces.webapp.AbstractFacesInitializer.buildConfiguration(AbstractFacesInitializer.java:416) at org.apache.myfaces.webapp.Jsp21FacesInitializer.initContainerIntegration(Jsp21FacesInitializer.java:73) at org.apache.myfaces.webapp.AbstractFacesInitializer.initFaces(AbstractFacesInitializer.java:172) at org.apache.myfaces.webapp.StartupServletContextListener.contextInitialized(StartupServletContextListener.java:119) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4768) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5230) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1388) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:921) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:835) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1388) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:921) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:263) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:437) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:934) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.startup.Catalina.start(Catalina.java:772) 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.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:476)
That is a regression in this fix and is tracked as bug 65433
Thanks for clarifying.