[
https://issues.apache.org/jira/browse/KAFKA-7346?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
KP updated KAFKA-7346:
----------------------
Description:
The Plugins class loads plugins using DelegatingClassLoader whose parent class
loader is Application class loader.
public DelegatingClassLoader(List<String> pluginPaths){
this(pluginPaths, ClassLoader.getSystemClassLoader()); //-> Application
class loader
}
When running Kafka Connect within tomcat web applications, Plugins#pluginClass
always throws ClassNotFoundException because "pluginClass" is loaded not by
Application class loader but by ParallelWebAppClassLoader.
protected static Class pluginClass(…){
Class<?> klass = loader.loadClass(classOrAlias, false); //-> Klass =
org.apache.kafka.connect.json.JsonConverter
if (pluginClass.isAssignableFrom(klass)) { //pluginClass =
org.apache.kafka.connect.storage.Converter
return (Class<? extends U>) klass;
}
throw new ClassNotFoundException(…);
}
Here is the class loader hierarchy when using JsonConverter:
Converter
-ParallelWebAppClassLoader
- URLClassLoader (parent)
-Launcher$AppClassLoader (parent)
JsonConverter
-PluginClassLoader
-DelegatingClassLoader(parent)
-Launher$AppClassLoader
was:
The Plugins class loads plugins using DelegatingClassLoader whose parent class
loader is Application class loader.
{quote}public DelegatingClassLoader(List<String> pluginPaths){
this(pluginPaths, ClassLoader.getSystemClassLoader()); //-> Application
class loader
}
{quote}
When running Kafka Connect within tomcat web applications, Plugins#pluginClass
always throws ClassNotFoundException because "pluginClass" is loaded not by
Application class loader but by ParallelWebAppClassLoader.
{quote}protected static Class pluginClass(...){
Class<?> klass = loader.loadClass(classOrAlias, false);
if (pluginClass.isAssignableFrom(klass))
Unknown macro: \{ // -> returns false return (Class<? extends U>)
klass; }
throw new ClassNotFoundException(...);
}
{quote}
Here is the class loader hierarchy when using JsonConverter:
Converter
-ParallelWebAppClassLoader
- URLClassLoader (parent)
-Launcher$AppClassLoader (parent)
JsonConverter
-PluginClassLoader
-DelegatingClassLoader(parent)
-Launher$AppClassLoader
> Cannot run Kafka Connect within a web application
> -------------------------------------------------
>
> Key: KAFKA-7346
> URL: https://issues.apache.org/jira/browse/KAFKA-7346
> Project: Kafka
> Issue Type: Bug
> Components: KafkaConnect
> Affects Versions: 1.1.1
> Reporter: KP
> Priority: Major
>
> The Plugins class loads plugins using DelegatingClassLoader whose parent
> class loader is Application class loader.
> public DelegatingClassLoader(List<String> pluginPaths){
> this(pluginPaths, ClassLoader.getSystemClassLoader()); //-> Application
> class loader
> }
>
> When running Kafka Connect within tomcat web applications,
> Plugins#pluginClass always throws ClassNotFoundException because
> "pluginClass" is loaded not by Application class loader but by
> ParallelWebAppClassLoader.
> protected static Class pluginClass(…){
> Class<?> klass = loader.loadClass(classOrAlias, false); //-> Klass =
> org.apache.kafka.connect.json.JsonConverter
> if (pluginClass.isAssignableFrom(klass)) { //pluginClass =
> org.apache.kafka.connect.storage.Converter
> return (Class<? extends U>) klass;
> }
> throw new ClassNotFoundException(…);
> }
>
> Here is the class loader hierarchy when using JsonConverter:
> Converter
> -ParallelWebAppClassLoader
> - URLClassLoader (parent)
> -Launcher$AppClassLoader (parent)
> JsonConverter
> -PluginClassLoader
> -DelegatingClassLoader(parent)
> -Launher$AppClassLoader
>
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)