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]