From 89452b60c6fc5e1e683644986c386d974efed322 Mon Sep 17 00:00:00 2001 From: Sanjay Malakar Date: Wed, 4 Mar 2026 20:20:09 +0000 Subject: [PATCH] Fix JarFile leak in PackageScanner#getClasses --- .../rest/utils/mounting/PackageScanner.java | 65 ++++++++++++------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/wicketstuff-restannotations-parent/restannotations/src/main/java/org/wicketstuff/rest/utils/mounting/PackageScanner.java b/wicketstuff-restannotations-parent/restannotations/src/main/java/org/wicketstuff/rest/utils/mounting/PackageScanner.java index f3fb71e9f0..5a2f5fe441 100644 --- a/wicketstuff-restannotations-parent/restannotations/src/main/java/org/wicketstuff/rest/utils/mounting/PackageScanner.java +++ b/wicketstuff-restannotations-parent/restannotations/src/main/java/org/wicketstuff/rest/utils/mounting/PackageScanner.java @@ -141,38 +141,55 @@ private static Class[] getClasses(String packageName) throws ClassNotFoundExc Enumeration resources = classLoader.getResources(path); List dirs = new ArrayList<>(); List jars = new ArrayList<>(); + try { + while (resources.hasMoreElements()) + { + URL resource = resources.nextElement(); + String protocol = resource.getProtocol(); + + if("jar".equals(protocol) || "wsjar".equals(protocol)) + { + String jarFileName = URLDecoder.decode(resource.getFile(), "UTF-8"); + jarFileName = jarFileName.substring(5,jarFileName.indexOf("!")); + + jars.add(new JarFile(jarFileName)); + } + else + { + dirs.add(new File(resource.toURI())); + } + } - while (resources.hasMoreElements()) - { - URL resource = resources.nextElement(); - String protocol = resource.getProtocol(); + ArrayList> classes = new ArrayList>(); - if("jar".equals(protocol) || "wsjar".equals(protocol)) + for (File directory : dirs) { - String jarFileName = URLDecoder.decode(resource.getFile(), "UTF-8"); - jarFileName = jarFileName.substring(5,jarFileName.indexOf("!")); - - jars.add(new JarFile(jarFileName)); + classes.addAll(findClasses(directory, packageName)); } - else + + for (JarFile jarFile : jars) { - dirs.add(new File(resource.toURI())); + classes.addAll(findClasses(jarFile, path)); } - } - - ArrayList> classes = new ArrayList>(); - for (File directory : dirs) - { - classes.addAll(findClasses(directory, packageName)); - } - - for (JarFile jarFile : jars) - { - classes.addAll(findClasses(jarFile, path)); + return classes.toArray(new Class[classes.size()]); + } finally { + IOException first = null; + for (JarFile jarFile : jars) { + try { + jarFile.close(); + } catch (IOException e) { + if (first == null) { + first = e; + } else { + first.addSuppressed(e); + } + } + } + if (first != null) { + throw first; + } } - - return classes.toArray(new Class[classes.size()]); }