From 339bbdca87f8c7a1d4502587ddba95177aa24705 Mon Sep 17 00:00:00 2001 From: Eric Bottard Date: Thu, 29 Aug 2019 18:10:50 +0200 Subject: [PATCH] Use proper traditional CL parent delegation. This ultimately allows loading all JRE classes correctly, not only those whose name are whitelisted. --- .../deployer/FunctionArchiveDeployer.java | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/FunctionArchiveDeployer.java b/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/FunctionArchiveDeployer.java index 88519a9fb..8d61211f2 100644 --- a/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/FunctionArchiveDeployer.java +++ b/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/FunctionArchiveDeployer.java @@ -130,20 +130,13 @@ class FunctionArchiveDeployer extends JarLauncher { * class loader, this will ensure that certain classes (e.g., org.reactivestreams.* see #shouldLoadViaDeployerLoader() ) * are shared across two class loaders. */ - this.archiveLoader = new LaunchedURLClassLoader(urls, null) { + final ClassLoader deployerClassLoader = getClass().getClassLoader(); + this.archiveLoader = new LaunchedURLClassLoader(urls, deployerClassLoader.getParent()) { @Override public Class loadClass(String name) throws ClassNotFoundException { Class clazz = null; if (shouldLoadViaDeployerLoader(name)) { - try { - clazz = getClass().getClassLoader().loadClass(name); - } - catch (Exception e) { - if (logger.isDebugEnabled()) { - logger.debug("Class '" + name + "' is not available in the current class loader. Loading it from the deployed archive."); - } - clazz = super.loadClass(name, false); - } + clazz = deployerClassLoader.loadClass(name); } else if (name.equals(DeployerContextUtils.class.getName())) { /* @@ -169,9 +162,7 @@ class FunctionArchiveDeployer extends JarLauncher { private boolean shouldLoadViaDeployerLoader(String name) { return name.startsWith("org.reactivestreams") - || name.startsWith("reactor.") - || name.startsWith("java") - || name.startsWith("com.sun"); + || name.startsWith("reactor."); } private String discoverFunctionClassName(FunctionProperties functionProperties) {