From 80525f1c9165fde93fd3b0c73b77ff66fd02d1cb Mon Sep 17 00:00:00 2001 From: Emmanuel Hugonnet Date: Mon, 5 Nov 2018 16:42:21 +0100 Subject: [PATCH] [ARTEMIS-2163]: Classloading issue if artemis-commons is not in the same classloader as artemis-client-* or artemis-server. * Passing the owner class to define the classloader to load classes via ClassLoadingUtil with artemis-commons in a different classloader.. JIRA: https://issues.apache.org/jira/browse/ARTEMIS-2163 --- .../activemq/artemis/utils/ClassloadingUtil.java | 12 ++++++++++-- .../core/client/impl/ClientSessionFactoryImpl.java | 2 +- .../artemis/core/client/impl/ServerLocatorImpl.java | 6 +++--- .../remoting/impl/TransportConfigurationUtil.java | 2 +- .../jms/client/ActiveMQConnectionFactory.java | 2 +- .../core/deployers/impl/FileConfigurationParser.java | 4 ++-- 6 files changed, 18 insertions(+), 10 deletions(-) diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/ClassloadingUtil.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/ClassloadingUtil.java index 9ea1b61050..99c39e0419 100644 --- a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/ClassloadingUtil.java +++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/ClassloadingUtil.java @@ -35,7 +35,11 @@ public final class ClassloadingUtil { private static final String INSTANTIATION_EXCEPTION_MESSAGE = "Your class must have a constructor without arguments. If it is an inner class, it must be static!"; public static Object newInstanceFromClassLoader(final String className) { - ClassLoader loader = ClassloadingUtil.class.getClassLoader(); + return newInstanceFromClassLoader(ClassloadingUtil.class, className); + } + + public static Object newInstanceFromClassLoader(final Class classOwner, final String className) { + ClassLoader loader = classOwner.getClassLoader(); try { Class clazz = loader.loadClass(className); return clazz.newInstance(); @@ -60,7 +64,11 @@ public final class ClassloadingUtil { } public static Object newInstanceFromClassLoader(final String className, Object... objs) { - ClassLoader loader = ClassloadingUtil.class.getClassLoader(); + return newInstanceFromClassLoader(ClassloadingUtil.class, className, objs); + } + + public static Object newInstanceFromClassLoader(final Class classOwner, final String className, Object... objs) { + ClassLoader loader = classOwner.getClassLoader(); try { Class[] parametersType = new Class[objs.length]; for (int i = 0; i < objs.length; i++) { diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionFactoryImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionFactoryImpl.java index daac8f3498..b135677d77 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionFactoryImpl.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionFactoryImpl.java @@ -982,7 +982,7 @@ public class ClientSessionFactoryImpl implements ClientSessionFactoryInternal, C return AccessController.doPrivileged(new PrivilegedAction() { @Override public ConnectorFactory run() { - return (ConnectorFactory) ClassloadingUtil.newInstanceFromClassLoader(connectorFactoryClassName); + return (ConnectorFactory) ClassloadingUtil.newInstanceFromClassLoader(ClientSessionFactoryImpl.class, connectorFactoryClassName); } }); } diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ServerLocatorImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ServerLocatorImpl.java index 972c9c7178..856affdc78 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ServerLocatorImpl.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ServerLocatorImpl.java @@ -278,8 +278,8 @@ public final class ServerLocatorImpl implements ServerLocatorInternal, Discovery AccessController.doPrivileged(new PrivilegedAction() { @Override public Object run() { - loadBalancingPolicy = (ConnectionLoadBalancingPolicy) ClassloadingUtil.newInstanceFromClassLoader(connectionLoadBalancingPolicyClassName); - return null; + loadBalancingPolicy = (ConnectionLoadBalancingPolicy) ClassloadingUtil.newInstanceFromClassLoader(ServerLocatorImpl.class, connectionLoadBalancingPolicyClassName); + return null; } }); } @@ -1888,7 +1888,7 @@ public final class ServerLocatorImpl implements ServerLocatorInternal, Discovery String[] arrayInterceptor = interceptorList.split(","); for (String strValue : arrayInterceptor) { - Interceptor interceptor = (Interceptor) ClassloadingUtil.newInstanceFromClassLoader(strValue.trim()); + Interceptor interceptor = (Interceptor) ClassloadingUtil.newInstanceFromClassLoader(ServerLocatorImpl.class, strValue.trim()); interceptors.add(interceptor); } return null; diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/remoting/impl/TransportConfigurationUtil.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/remoting/impl/TransportConfigurationUtil.java index c6d8a5f47c..33bfbac36b 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/remoting/impl/TransportConfigurationUtil.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/remoting/impl/TransportConfigurationUtil.java @@ -65,7 +65,7 @@ public class TransportConfigurationUtil { @Override public Object run() { try { - return ClassloadingUtil.newInstanceFromClassLoader(className); + return ClassloadingUtil.newInstanceFromClassLoader(TransportConfigurationUtil.class, className); } catch (IllegalStateException e) { return null; } diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnectionFactory.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnectionFactory.java index 364862b8f6..ac0f8ebf8c 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnectionFactory.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnectionFactory.java @@ -152,7 +152,7 @@ public class ActiveMQConnectionFactory extends JNDIStorable implements Connectio AccessController.doPrivileged(new PrivilegedAction() { @Override public Object run() { - ClientProtocolManagerFactory protocolManagerFactory = (ClientProtocolManagerFactory) ClassloadingUtil.newInstanceFromClassLoader(protocolManagerFactoryStr); + ClientProtocolManagerFactory protocolManagerFactory = (ClientProtocolManagerFactory) ClassloadingUtil.newInstanceFromClassLoader(ActiveMQConnectionFactory.class, protocolManagerFactoryStr); serverLocator.setProtocolManagerFactory(protocolManagerFactory); return null; } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java index 255cce6d16..00db3f83d7 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java @@ -723,7 +723,7 @@ public final class FileConfigurationParser extends XMLConfigurationUtil { ActiveMQServerPlugin serverPlugin = AccessController.doPrivileged(new PrivilegedAction() { @Override public ActiveMQServerPlugin run() { - return (ActiveMQServerPlugin) ClassloadingUtil.newInstanceFromClassLoader(clazz); + return (ActiveMQServerPlugin) ClassloadingUtil.newInstanceFromClassLoader(FileConfigurationParser.class, clazz); } }); @@ -926,7 +926,7 @@ public final class FileConfigurationParser extends XMLConfigurationUtil { SecuritySettingPlugin securitySettingPlugin = AccessController.doPrivileged(new PrivilegedAction() { @Override public SecuritySettingPlugin run() { - return (SecuritySettingPlugin) ClassloadingUtil.newInstanceFromClassLoader(clazz); + return (SecuritySettingPlugin) ClassloadingUtil.newInstanceFromClassLoader(FileConfigurationParser.class, clazz); } });