jungm opened a new pull request, #2848:
URL: https://github.com/apache/tomee/pull/2848

   ## What
   
   When a war's `web.xml` or annotations name a servlet, filter or listener 
class that is **not packaged in the war**, 
`AnnotationDeployer.ProcessAnnotatedBeans.deploy(WebModule)` rethrew the 
`ClassNotFoundException`/`NoClassDefFoundError` as an `OpenEJBException`. That 
propagates out through `ConfigurationFactory.configureApplication` and aborts 
startup of the **whole** web context.
   
   This changes the servlet, filter and listener paths to log a warning and 
continue instead of failing.
   
   ## Why
   
   These `classLoader.loadClass(...)` calls exist only to feed the annotation 
scanner. A class that cannot be loaded simply contributes nothing to scan โ€” it 
should not bring the context down.
   
   The old behaviour was also internally inconsistent: the taglib-listener loop 
right below, and the servlet *name-fallback* case, already only logged and 
continued. Only the explicit-class servlet/filter/listener paths were fatal.
   
   Jakarta Servlet 6.1 ยง2.3.1 ("Loading and Instantiation") permits servlet 
loading to be *"delayed until the container determines the servlet is needed to 
service a request"*, so deferring an unresolved class rather than failing 
eagerly at deploy time is spec-compliant. If such a component is actually used, 
Tomcat still surfaces the missing class per-component.
   
   The `WsDeployer` throw for webservice servlet classes was intentionally left 
as-is, since a WS endpoint genuinely cannot be built without its class.
   
   ## Also
   
   Fixed off-by-one `MessageFormat` placeholder indices (`{1}{2}{3}` โ†’ 
`{0}{1}{2}`) in the four related `logger.debug` calls, which were dropping the 
first argument from the message.
   
   ## Testing
   
   Added 
`AnnotationDeployerTest.missingServletFilterAndListenerClassesDoNotFailDeployment`,
 using the class names from the ticket (`TestServlet1`, `AddFilterString`, plus 
a missing listener). Verified it is a real regression test: reverting the 
servlet fix makes it fail with exactly the reported error (`OpenEJBException: 
Unable to load servlet class: ...TestServlet1`), and it passes with the fix.
   
   This is the TomEE-side fix for the two Jakarta Servlet TCK deployments that 
triggered the abort (`RegistrationTests` naming filter `AddFilterString`; 
`DefaultMappingTests` naming servlet `TestServlet1`). Removing the 
corresponding entries from `runner-standalone/exclusions/servlet.txt` in the 
apache/tomee-tck harness and confirming both classes pass is a follow-up in 
that separate repo.
   
   Jira: https://issues.apache.org/jira/browse/TOMEE-4642
   
   ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to