From 33ecc3bfb4f6adf0e5083b25395b30726e2a0521 Mon Sep 17 00:00:00 2001 From: Matthew Moss Date: Mon, 25 Sep 2023 06:35:46 -0500 Subject: [PATCH] Issue 9905 websphere deploy war (#9906) * Workaround quirks with WebSphere classloader * Remove nulls from collected bean definition refs * Fix issue link * Revert "Remove nulls from collected bean definition refs" This reverts commit 4846e62272f761492746f040856194a37694c814. --- .../java/io/micronaut/core/io/IOUtils.java | 3 ++- .../core/io/service/ServiceScanner.java | 18 +++++++++++++++++- .../io/micronaut/core/io/IOUtilsSpec.groovy | 3 +++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/io/micronaut/core/io/IOUtils.java b/core/src/main/java/io/micronaut/core/io/IOUtils.java index 3861a6bec5e..a055a29053c 100644 --- a/core/src/main/java/io/micronaut/core/io/IOUtils.java +++ b/core/src/main/java/io/micronaut/core/io/IOUtils.java @@ -60,6 +60,7 @@ public class IOUtils { private static final String SCHEME_FILE = "file"; private static final String SCHEME_JAR = "jar"; private static final String SCHEME_ZIP = "zip"; + private static final String SCHEME_WSJAR = "wsjar"; private static final String COLON = ":"; @@ -125,7 +126,7 @@ static Path resolvePath(@NonNull URI uri, IOExceptionBiFunction, String, Path> loadNestedJarUriFunction) throws IOException { String scheme = uri.getScheme(); try { - if (SCHEME_JAR.equals(scheme) || SCHEME_ZIP.equals(scheme)) { + if (SCHEME_JAR.equals(scheme) || SCHEME_ZIP.equals(scheme) || SCHEME_WSJAR.equals(scheme)) { // try to match FileSystems.newFileSystem(URI) semantics for zipfs here. // Basically ignores anything after the !/ if it exists, and uses the part // before as the jar path to extract. diff --git a/core/src/main/java/io/micronaut/core/io/service/ServiceScanner.java b/core/src/main/java/io/micronaut/core/io/service/ServiceScanner.java index 73ca1cfac9d..10ad1332f29 100644 --- a/core/src/main/java/io/micronaut/core/io/service/ServiceScanner.java +++ b/core/src/main/java/io/micronaut/core/io/service/ServiceScanner.java @@ -119,12 +119,28 @@ private Set computeStandardServiceTypeNames(URL url) { return typeNames; } + private boolean isWebSphereClassLoader() { + return classLoader.getClass().getName().startsWith("com.ibm.ws.classloader"); + } + + private String buildResourceSearchPath() { + String path = "META-INF/micronaut/" + serviceName; + + if (isWebSphereClassLoader()) { + // Special case WebSphere classloader + // https://github.com/micronaut-projects/micronaut-core/issues/9905 + return path + "/"; + } + + return path; + } + private Enumeration findStandardServiceConfigs() throws IOException { return classLoader.getResources(SoftServiceLoader.META_INF_SERVICES + '/' + serviceName); } private void findMicronautMetaServiceConfigs(BiConsumer consumer) throws IOException, URISyntaxException { - final String path = "META-INF/micronaut/" + serviceName; + String path = buildResourceSearchPath(); final Enumeration micronautResources = classLoader.getResources(path); Set uniqueURIs = new LinkedHashSet<>(); while (micronautResources.hasMoreElements()) { diff --git a/core/src/test/groovy/io/micronaut/core/io/IOUtilsSpec.groovy b/core/src/test/groovy/io/micronaut/core/io/IOUtilsSpec.groovy index c6e933e0192..2e6cdda14e6 100644 --- a/core/src/test/groovy/io/micronaut/core/io/IOUtilsSpec.groovy +++ b/core/src/test/groovy/io/micronaut/core/io/IOUtilsSpec.groovy @@ -144,6 +144,9 @@ class IOUtilsSpec extends Specification { "META-INF/micronaut/io.micronaut.inject.BeanConfiguration" | "/META-INF/micronaut/io.micronaut.inject.BeanConfiguration" | "jar:file:/Users/sdelamo/.m2/repository/io/micronaut/micronaut-jackson-databind/3.5.7/micronaut-jackson-databind-3.5.7.jar!/META-INF/micronaut/io.micronaut.inject.BeanConfiguration" "META-INF/micronaut/io.micronaut.inject.BeanConfiguration" | "/META-INF/micronaut/io.micronaut.inject.BeanConfiguration" | "zip:/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/issue8386-0.1/y2p3pa/war/WEB-INF/lib/micronaut-jackson-databind-3.5.7.jar!/META-INF/micronaut/io.micronaut.inject.BeanConfiguration/" "META-INF/micronaut/io.micronaut.inject.BeanConfiguration" | "/META-INF/micronaut/io.micronaut.inject.BeanConfiguration" | "zip:C:/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/issue8386-0.1/y2p3pa/war/WEB-INF/lib/micronaut-jackson-databind-3.5.7.jar!/META-INF/micronaut/io.micronaut.inject.BeanConfiguration/" + "META-INF/micronaut/io.micronaut.inject.BeanDefinitionReference" | "/META-INF/micronaut/io.micronaut.inject.BeanDefinitionReference" | "wsjar:file:/path/to/io/micronaut/micronaut-json-core/3.5.7/micronaut-json-core-3.5.7.jar!/META-INF/micronaut/io.micronaut.inject.BeanDefinitionReference" + "META-INF/micronaut/io.micronaut.inject.BeanConfiguration" | "/META-INF/micronaut/io.micronaut.inject.BeanConfiguration" | "wsjar:/path/to/io/micronaut/micronaut-jackson-databind/3.5.7/micronaut-jackson-databind-3.5.7.jar!/META-INF/micronaut/io.micronaut.inject.BeanConfiguration" + "META-INF/micronaut/io.micronaut.inject.BeanConfiguration" | "/META-INF/micronaut/io.micronaut.inject.BeanConfiguration" | "wsjar:C:/path/to/io/micronaut/micronaut-jackson-databind/3.5.7/micronaut-jackson-databind-3.5.7.jar!/META-INF/micronaut/io.micronaut.inject.BeanConfiguration" } void "resolvePath will fix jar uri on Windows/WebLogic"() {