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;
}