diff --git a/jetty-client/pom.xml b/jetty-client/pom.xml index 92f6a792766..100dd8e3496 100644 --- a/jetty-client/pom.xml +++ b/jetty-client/pom.xml @@ -51,6 +51,7 @@ shade + true true hybrid diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ModuleLocation.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ModuleLocation.java index 7fc26fc84d1..b5eb4ebd939 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/ModuleLocation.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ModuleLocation.java @@ -23,6 +23,7 @@ import java.lang.invoke.MethodHandles; import java.lang.reflect.Method; import java.net.URI; import java.util.Optional; +import java.util.function.Function; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; @@ -53,7 +54,7 @@ import static java.lang.invoke.MethodType.methodType; * * In Jetty 10, this entire class can be moved to direct calls to java.lang.Module in TypeUtil.getModuleLocation() */ -class ModuleLocation +class ModuleLocation implements Function, URI> { private static final Logger LOG = Log.getLogger(ModuleLocation.class); @@ -100,7 +101,8 @@ class ModuleLocation } } - public URI getModuleLocation(Class clazz) + @Override + public URI apply(Class clazz) { try { diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java b/jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java index 6ec3d8ada0b..655ad624b9c 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java @@ -38,6 +38,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; @@ -178,7 +179,7 @@ public class TypeUtil } private static final MethodHandle[] LOCATION_METHODS; - private static final ModuleLocation MODULE_LOCATION; + private static final Function, URI> MODULE_LOCATION; static { @@ -190,17 +191,23 @@ public class TypeUtil try { locationMethods.add(lookup.findStatic(TypeUtil.class, "getCodeSourceLocation", type)); - ModuleLocation moduleLocation = null; + Function, URI> moduleFunc = null; try { - moduleLocation = new ModuleLocation(); - locationMethods.add(lookup.findStatic(TypeUtil.class, "getModuleLocation", type)); + Class clazzModuleLocation = Class.forName(TypeUtil.class.getPackage().getName() + ".ModuleLocation"); + Object obj = clazzModuleLocation.getConstructor().newInstance(); + if (obj instanceof Function) + { + //noinspection unchecked + moduleFunc = (Function, URI>)obj; + locationMethods.add(lookup.findStatic(TypeUtil.class, "getModuleLocation", type)); + } } - catch (UnsupportedOperationException e) + catch (Throwable t) { - LOG.debug("JVM Runtime does not support Modules"); + LOG.debug("This JVM Runtime does not support Modules, disabling Jetty internal support"); } - MODULE_LOCATION = moduleLocation; + MODULE_LOCATION = moduleFunc; locationMethods.add(lookup.findStatic(TypeUtil.class, "getClassLoaderLocation", type)); locationMethods.add(lookup.findStatic(TypeUtil.class, "getSystemClassLoaderLocation", type)); LOCATION_METHODS = locationMethods.toArray(new MethodHandle[0]); @@ -723,7 +730,7 @@ public class TypeUtil // In Jetty 10, this method can be implemented directly, without reflection if (MODULE_LOCATION != null) { - return MODULE_LOCATION.getModuleLocation(clazz); + return MODULE_LOCATION.apply(clazz); } return null; }