[ 
https://issues.apache.org/jira/browse/KAFKA-6139?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Eugene Burd resolved KAFKA-6139.
--------------------------------
    Resolution: Information Provided

Error was due to having the plugin directory set a level too low (pointing 
inside the plugin). 

> error when loading plugins
> --------------------------
>
>                 Key: KAFKA-6139
>                 URL: https://issues.apache.org/jira/browse/KAFKA-6139
>             Project: Kafka
>          Issue Type: Bug
>          Components: KafkaConnect
>    Affects Versions: 0.11.0.0
>            Reporter: Eugene Burd
>
> I am trying to run the Big Query connector for KafkaConnect 
> (https://github.com/wepay/kafka-connect-bigquery).  I have configured it 
> using a docker container, dropped the jar files for the connector in the 
> container and configured the plugin.path in the kafka connect config to point 
> to the directory with the jars.  
> Upon startup, Kafka is scanning the plugin folder and evaluating all the jar 
> files found.  It encounters the connector jar file, tests to see if it 
> extends a connector (in this case kcbq-connector-1.0.0-SNAPSHOT.jar), but 
> then it proceeds to create a new instance of the connector.  Code snippet 
> from DelegatingClassLoader.java below.  The problem is that the connector 
> class relies on other jar files that are in the plugin folder, but not in the 
> path.  This causes a class not found exception (below). 
> I suspect when the plugin connector is actually executed, it is done through 
> an isolated context and that context's classpath is set to the plugin folder, 
> so i think the connector would actually work.  But scanning for the connector 
> fails prior to ever getting there.
> I understand that you need a version of the connector and hence why this code 
> is running, but i think the new instance creation for version check needs to 
> be done in a sandbox to support the classpaths of the plugin connector. 
> [2017-10-28 06:04:08,961] INFO Loading plugin from: 
> /usr/share/java/kafka-connect-bigquery/kcbq-connector-1.0.0-SNAPSHOT.jar 
> (org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader:176)
> Exception in thread "main" java.lang.NoClassDefFoundError: 
> com/google/cloud/bigquery/BigQuery
>         at java.lang.Class.getDeclaredConstructors0(Native Method)
>         at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
>         at java.lang.Class.getConstructor0(Class.java:3075)
>         at java.lang.Class.newInstance(Class.java:412)
>         at 
> org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.getPluginDesc(DelegatingClassLoader.java:242)
>         at 
> org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.scanPluginPath(DelegatingClassLoader.java:223)
>         at 
> org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.scanUrlsAndAddPlugins(DelegatingClassLoader.java:198)
>         at 
> org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.registerPlugin(DelegatingClassLoader.java:190)
>         at 
> org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.initLoaders(DelegatingClassLoader.java:150)
>         at 
> org.apache.kafka.connect.runtime.isolation.Plugins.<init>(Plugins.java:47)
>         at 
> org.apache.kafka.connect.cli.ConnectDistributed.main(ConnectDistributed.java:63)
> Caused by: java.lang.ClassNotFoundException: 
> com.google.cloud.bigquery.BigQuery
>         at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
>         at 
> org.apache.kafka.connect.runtime.isolation.PluginClassLoader.loadClass(PluginClassLoader.java:62)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
>         ... 11 more
> -------------------------
> private <T> Collection<PluginDesc<T>> getPluginDesc( 
>             Reflections reflections,
>             Class<T> klass,
>             ClassLoader loader
>     ) throws InstantiationException, IllegalAccessException {
>         Set<Class<? extends T>> plugins = reflections.getSubTypesOf(klass);
>         Collection<PluginDesc<T>> result = new ArrayList<>();
>         for (Class<? extends T> plugin : plugins) {
>             if (PluginUtils.isConcrete(plugin)) {
>                 // Temporary workaround until all the plugins are versioned.
>                 if (Connector.class.isAssignableFrom(plugin)) {
>                     result.add(
>                             new PluginDesc<>(
>                                     plugin,
>                                     ((Connector) 
> plugin.newInstance()).version(),
>                                     loader
>                             )
>                     );
>                 } else {
>                     result.add(new PluginDesc<>(plugin, "undefined", loader));
>                 }
>             }
>         }
>         return result;
>     }



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to