diff --git a/core-java-modules/core-java-classloader/pom.xml b/core-java-modules/core-java-classloader/pom.xml index dd5be7d18177..f0d530c94f63 100644 --- a/core-java-modules/core-java-classloader/pom.xml +++ b/core-java-modules/core-java-classloader/pom.xml @@ -11,6 +11,15 @@ 0.0.1-SNAPSHOT + + + com.google.guava + guava + ${guava.version} + test + + + @@ -36,11 +45,4 @@ - - 22 - 22 - UTF-8 - 22 - - \ No newline at end of file diff --git a/core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/ClassloaderDelegationModelTest.java b/core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/ClassloaderDelegationModelUnitTest.java similarity index 98% rename from core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/ClassloaderDelegationModelTest.java rename to core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/ClassloaderDelegationModelUnitTest.java index 148a71fbddf3..3d4c3e38d303 100644 --- a/core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/ClassloaderDelegationModelTest.java +++ b/core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/ClassloaderDelegationModelUnitTest.java @@ -15,7 +15,7 @@ import com.baeldung.classloader.internal.InternalClasspathResolver; import com.baeldung.classloader.internal.InternalJdkSupport; -class ClassloaderDelegationModelTest { +class ClassloaderDelegationModelUnitTest { private static final String CLASS_TO_LOAD = "com.google.common.base.Function"; diff --git a/core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/GetURLsFromClassloaderTest.java b/core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/GetURLsFromClassloaderUnitTest.java similarity index 98% rename from core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/GetURLsFromClassloaderTest.java rename to core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/GetURLsFromClassloaderUnitTest.java index 98862ac706af..efa263d2bfc9 100644 --- a/core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/GetURLsFromClassloaderTest.java +++ b/core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/GetURLsFromClassloaderUnitTest.java @@ -20,7 +20,7 @@ import com.baeldung.classloader.internal.InternalClasspathResolver; import com.baeldung.classloader.internal.InternalJdkSupport; -class GetURLsFromClassloaderTest { +class GetURLsFromClassloaderUnitTest { final Logger log = LoggerFactory.getLogger(getClass()); diff --git a/core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/ScopedClassLoadingTest.java b/core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/ScopedClassLoadingUnitTest.java similarity index 73% rename from core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/ScopedClassLoadingTest.java rename to core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/ScopedClassLoadingUnitTest.java index 52694fd2f592..02a04abae04b 100644 --- a/core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/ScopedClassLoadingTest.java +++ b/core-java-modules/core-java-classloader/src/test/java/com/baeldung/classloader/ScopedClassLoadingUnitTest.java @@ -9,6 +9,8 @@ import java.net.MalformedURLException; import java.net.URI; import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Arrays; import java.util.HashSet; import java.util.Objects; @@ -24,27 +26,26 @@ import com.baeldung.classloader.internal.InternalJdkSupport; import com.baeldung.classloader.spi.ClasspathResolver; -class ScopedClassLoadingTest { +class ScopedClassLoadingUnitTest { final Logger log = LoggerFactory.getLogger(getClass()); /** * Some ides may treat test-classes as a dynamic module-path. - * */ private void ammendTestClasspath(Set classpath) { var testCp = classpath.stream() - .filter(url -> Objects.equals(url.getProtocol(), "file") && url.getPath() - .contains("test-classes")) - .findFirst() - .orElse(null); + .filter(url -> Objects.equals(url.getProtocol(), "file") && url.getPath() + .contains("test-classes")) + .findFirst() + .orElse(null); if (testCp == null) { log.info("Amending test classpath for Eclipse"); var loc = getClass().getProtectionDomain() - .getCodeSource() - .getLocation(); + .getCodeSource() + .getLocation(); testCp = toURL(loc.toString()); @@ -60,15 +61,15 @@ private Set createNarrowClasspath(Predicate filter) { var loader = getClass().getClassLoader(); var full = ClasspathResolver.get() - .getFullClasspath(loader); + .getFullClasspath(loader); ammendTestClasspath(full); mergeClasspathWithModulePath(full, filter); var classpath = full.stream() - .filter(filter) - .collect(Collectors.toCollection(HashSet::new)); + .filter(filter) + .collect(Collectors.toCollection(HashSet::new)); log.info("Narrowed Classpath: \n[\n{}\n]", classpath); @@ -80,14 +81,14 @@ void givenAForkedJVM_whenClassPathIsNarrowed_thenAccessWillBeLimitedToItsScope() var scope = Pattern.compile("(test-classes|slf|logback)"); var classpath = createNarrowClasspath(url -> scope.matcher(url.toString()) - .find()).stream() - .map(URL::toString) - .collect(Collectors.joining(":")); + .find()).stream() + .map(URL::toString) + .collect(Collectors.joining(":")); var executable = ProcessHandle.current() - .info() - .command() - .orElse("java"); + .info() + .command() + .orElse("java"); var pb = new ProcessBuilder(executable, "-cp"); var command = pb.command(); @@ -99,7 +100,7 @@ void givenAForkedJVM_whenClassPathIsNarrowed_thenAccessWillBeLimitedToItsScope() pb.redirectError(Redirect.INHERIT); log.info("VM at PID {} will fork another JVM with narrowed classpath", ProcessHandle.current() - .pid()); + .pid()); var process = pb.start(); @@ -110,7 +111,7 @@ void givenAForkedJVM_whenClassPathIsNarrowed_thenAccessWillBeLimitedToItsScope() @Test void givenScopedClassLoader_whenClasspathIsNarrowed_thenAccessWillBeLimitedToItsScope() throws InterruptedException, IOException, - ReflectiveOperationException { + ReflectiveOperationException { var thread = Thread.currentThread(); var current = thread.getContextClassLoader(); @@ -119,7 +120,7 @@ void givenScopedClassLoader_whenClasspathIsNarrowed_thenAccessWillBeLimitedToIts var scope = Pattern.compile("(test-classes|slf|logback)"); var classpath = createNarrowClasspath(url -> scope.matcher(url.toString()) - .find()).toArray(URL[]::new); + .find()).toArray(URL[]::new); var loader = new CustomClassLoader(classpath); @@ -127,12 +128,12 @@ void givenScopedClassLoader_whenClasspathIsNarrowed_thenAccessWillBeLimitedToIts try { var service = Class.forName(ForkedService.class.getName(), true, Thread.currentThread() - .getContextClassLoader()); + .getContextClassLoader()); assertEquals(loader, service.getClassLoader()); ((Runnable) service.getConstructor() - .newInstance()).run(); + .newInstance()).run(); } finally { thread.setContextClassLoader(current); } @@ -144,22 +145,27 @@ private void mergeClasspathWithModulePath(Set files, Predicate filter) if (modules != null && !modules.isBlank()) { log.info("Converting module-path ({}) to classpath", modules); - Arrays.stream(modules.split(":")) - .map(this::toURL) - .filter(filter) - .forEach(files::add); + String pathSeparator = System.getProperty("path.separator"); + + Arrays.stream(modules.split(Pattern.quote(pathSeparator))) + .map(this::toURL) + .filter(filter) + .forEach(files::add); } else { log.info("No module path"); } } private URL toURL(String name) { - if (!name.startsWith("file:")) { - name = "file://" + name; - } try { - return URI.create(name) - .toURL(); + // If it's already a valid URL, use it as-is + if (name.startsWith("file:")) { + return URI.create(name).toURL(); + } + + Path path = Paths.get(name); + return path.toUri().toURL(); + } catch (MalformedURLException e) { throw new UncheckedIOException(e); } diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 08b2b801ee14..03e2bf72ba6b 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -83,7 +83,7 @@ core-java-arrays-operations-advanced-3 core-java-booleans core-java-char - + core-java-collections core-java-collections-2 core-java-collections-3 diff --git a/pom.xml b/pom.xml index d34acb1b2d77..8a4c37046173 100644 --- a/pom.xml +++ b/pom.xml @@ -868,6 +868,7 @@ core-java-modules/core-java-22 core-java-modules/core-java-concurrency-advanced-6 + core-java-modules/core-java-classloader @@ -1292,6 +1293,7 @@ core-java-modules/core-java-22 core-java-modules/core-java-concurrency-advanced-6 + core-java-modules/core-java-classloader @@ -1506,7 +1508,6 @@ web-modules/ninja spring-cloud-modules/spring-cloud-task/springcloudtaskbatch aspectj - core-java-modules/core-java-classloader persistence-modules/hibernate-queries-2 @@ -1573,7 +1574,6 @@ web-modules/ninja spring-cloud-modules/spring-cloud-task/springcloudtaskbatch aspectj - core-java-modules/core-java-classloader persistence-modules/hibernate-queries-2