This is an automated email from the ASF dual-hosted git repository. rzo1 pushed a commit to branch tomee-10.x in repository https://gitbox.apache.org/repos/asf/tomee.git
commit 07c28448ea3ede0928ae159d2cd87f6bd65af486 Author: Richard Zowalla <[email protected]> AuthorDate: Tue Oct 13 08:47:20 2026 +0200 Log webapp jars skipped by the scan exclusion list (#3069) Annotations of such jars (including security ones) were dropped silently. (cherry picked from commit 3d61320135b892ff1f522d4ea28f83cd31a65819) --- .../apache/openejb/config/DeploymentLoader.java | 46 +++++++++++++++- .../apache/openejb/config/NewLoaderLogicTest.java | 63 ++++++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java b/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java index 2fb22ae0b1..2c32244be8 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java @@ -1150,7 +1150,51 @@ public class DeploymentLoader implements DeploymentFilterable { } catch (final MalformedURLException e) { return Arrays.asList(webUrls); } - return urls.getUrls(); + + final List<URL> scannable = urls.getUrls(); + final Collection<String> excludedWebappJars = builtinExcludedWebappJars(webUrls, scannable, excludeFilter); + if (!excludedWebappJars.isEmpty()) { + LOGGER.info("Application jars not scanned for annotations (e.g. @WebServlet, @ServletSecurity, @RolesAllowed)" + + " because their name matches a container scan exclusion prefix: " + excludedWebappJars + + ". To scan them, set the system property openejb.additional.include to the listed prefix" + + " (this re-enables scanning of every jar with that prefix and needs a restart)"); + } + return scannable; + } + + // webapp jars dropped by the container exclusion list, reported as "jar (prefix 'p')"; + // jars excluded by WEB-INF/exclusions.list or custom filters are explicit so not reported + static Collection<String> builtinExcludedWebappJars(final URL[] webUrls, final List<URL> scannable, final Filter excludeFilter) { + final Set<String> kept = new HashSet<>(); + for (final URL url : scannable) { + kept.add(url.toExternalForm()); + } + + final Collection<String> excluded = new ArrayList<>(); + for (final URL url : webUrls) { + if (kept.contains(url.toExternalForm())) { + continue; + } + try { + final File file = URLs.toFile(url); + if (!file.getAbsolutePath().replace('\\', '/').contains("/WEB-INF/")) { + continue; + } + final String name = NameFiltering.filter(file).getName(); + if (excludeFilter != null && excludeFilter.accept(name)) { + continue; + } + for (final String prefix : NewLoaderLogic.getExclusions()) { + if (name.startsWith(prefix) || prefix.endsWith("-") && name.equals(prefix.substring(0, prefix.length() - 1) + ".jar")) { + excluded.add(file.getName() + " (prefix '" + prefix + "')"); + break; + } + } + } catch (final IllegalArgumentException iae) { + // no-op + } + } + return excluded; } public static void addBeansXmls(final WebModule webModule) { diff --git a/container/openejb-core/src/test/java/org/apache/openejb/config/NewLoaderLogicTest.java b/container/openejb-core/src/test/java/org/apache/openejb/config/NewLoaderLogicTest.java index cfa01bfd3e..f62892fe84 100644 --- a/container/openejb-core/src/test/java/org/apache/openejb/config/NewLoaderLogicTest.java +++ b/container/openejb-core/src/test/java/org/apache/openejb/config/NewLoaderLogicTest.java @@ -16,8 +16,21 @@ */ package org.apache.openejb.config; +import org.apache.openejb.util.LogCategory; import org.junit.Test; +import java.io.File; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.logging.Handler; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -31,4 +44,54 @@ public class NewLoaderLogicTest { assertFalse(NewLoaderLogic.skip("openejb-noexclude.jar")); assertFalse(NewLoaderLogic.skip("business-foo-1.2.3.jar")); } + + @Test + public void reportWebappJarsDroppedByContainerExclusions() throws Exception { + final File base = new File("target/NewLoaderLogicTest"); + final File lib = new File(base, "app/WEB-INF/lib"); + final URL collidingAppJar = new File(lib, "ant-reporting-web.jar").toURI().toURL(); + final URL appJar = new File(lib, "business.jar").toURI().toURL(); + final URL explicitlyExcludedAppJar = new File(lib, "internal-tools.jar").toURI().toURL(); + final URL containerJar = new File(base, "tomee/lib/ant-1.10.15.jar").toURI().toURL(); + final URL[] webUrls = {collidingAppJar, appJar, explicitlyExcludedAppJar, containerJar}; + + final File exclusions = new File(base, "app/WEB-INF/exclusions.list"); + exclusions.getParentFile().mkdirs(); + Files.write(exclusions.toPath(), "internal-\n".getBytes(StandardCharsets.UTF_8)); + + final List<LogRecord> records = new ArrayList<>(); + final Handler handler = new Handler() { + @Override + public void publish(final LogRecord record) { + records.add(record); + } + + @Override + public void flush() { + // no-op + } + + @Override + public void close() { + // no-op + } + }; + final Logger logger = Logger.getLogger(LogCategory.OPENEJB_STARTUP_CONFIG.getName()); + logger.addHandler(handler); + try { + final List<URL> scannable = DeploymentLoader.filterWebappUrls(webUrls, null, exclusions.toURI().toURL()); + assertEquals(Collections.singletonList(appJar), scannable); + } finally { + logger.removeHandler(handler); + } + + final List<String> messages = new ArrayList<>(); + for (final LogRecord record : records) { + if (record.getMessage().startsWith("Application jars not scanned")) { + messages.add(record.getMessage()); + } + } + assertEquals(1, messages.size()); + assertTrue(messages.get(0), messages.get(0).contains("[ant-reporting-web.jar (prefix 'ant-')]")); + } }
