confluentinc / cp-docker-images

[DEPRECATED] Docker images for Confluent Platform.
Apache License 2.0
1.14k stars 705 forks source link

Can not find connector class #383

Open sailxjx opened 6 years ago

sailxjx commented 6 years ago

When upgrading to cp-connect-base 4.0.0, I met an error happened before, which is 'Can not find connector class'. However the error message shown my connector was in the available connector list

Failed to find any class that implements Connector and which name matches org.apache.kafka.connect.mongo.MongoSourceConnector, available connectors are: PluginDesc{klass=class org.apache.kafka.connect.file.FileStreamSinkConnector, name='org.apache.kafka.connect.file.FileStreamSinkConnector', version='1.0.0-cp1', encodedVersion=1.0.0-cp1, type=sink, typeName='sink', location='file:/usr/share/java/kafka/'}, PluginDesc{klass=class org.apache.kafka.connect.file.FileStreamSourceConnector, name='org.apache.kafka.connect.file.FileStreamSourceConnector', version='1.0.0-cp1', encodedVersion=1.0.0-cp1, type=source, typeName='source', location='file:/usr/share/java/kafka/'}, PluginDesc{klass=class org.apache.kafka.connect.mongo.MongoSinkConnector, name='org.apache.kafka.connect.mongo.MongoSinkConnector', version='1.0.0-cp1', encodedVersion=1.0.0-cp1, type=sink, typeName='sink', location='file:/usr/share/java/kafka-connect-mongo/'}, PluginDesc{klass=class org.apache.kafka.connect.mongo.MongoSourceConnector, name='org.apache.kafka.connect.mongo.MongoSourceConnector', version='1.0.0-cp1', encodedVersion=1.0.0-cp1, type=source, typeName='source', location='file:/usr/share/java/kafka-connect-mongo/'}, PluginDesc{klass=class org.apache.kafka.connect.tools.MockConnector, name='org.apache.kafka.connect.tools.MockConnector', version='1.0.0-cp1', encodedVersion=1.0.0-cp1, type=connector, typeName='connector', location='file:/usr/share/java/kafka/'}, PluginDesc{klass=class org.apache.kafka.connect.tools.MockSinkConnector, name='org.apache.kafka.connect.tools.MockSinkConnector', version='1.0.0-cp1', encodedVersion=1.0.0-cp1, type=sink, typeName='sink', location='file:/usr/share/java/kafka/'}, PluginDesc{klass=class org.apache.kafka.connect.tools.MockSourceConnector, name='org.apache.kafka.connect.tools.MockSourceConnector', version='1.0.0-cp1', encodedVersion=1.0.0-cp1, type=source, typeName='source', location='file:/usr/share/java/kafka/'}, PluginDesc{klass=class org.apache.kafka.connect.tools.SchemaSourceConnector, name='org.apache.kafka.connect.tools.SchemaSourceConnector', version='1.0.0-cp1', encodedVersion=1.0.0-cp1, type=source, typeName='source', location='file:/usr/share/java/kafka/'}, PluginDesc{klass=class org.apache.kafka.connect.tools.VerifiableSinkConnector, name='org.apache.kafka.connect.tools.VerifiableSinkConnector', version='1.0.0-cp1', encodedVersion=1.0.0-cp1, type=source, typeName='source', location='file:/usr/share/java/kafka/'}, PluginDesc{klass=class org.apache.kafka.connect.tools.VerifiableSourceConnector, name='org.apache.kafka.connect.tools.VerifiableSourceConnector', version='1.0.0-cp1', encodedVersion=1.0.0-cp1, type=source, typeName='source', location='file:/usr/share/java/kafka/'}

Can anyone give an explain?

SunYour commented 6 years ago

I'm facing a similar issue, "Failed to find any class that implements Connector and which name matches io.confluent.connect.jdbc.JdbcSourceConnector" when upgrading from 3.3.1 to 4.0.0 using a kafka connect clean image. It worked like a charm before upgrading to 4.0.0 and now I've tried to use both CLASSPATH and plugin.path to overcome the problem. My jdbc driver is not in the list of available plugins, though. Upgraded from 3.2.0 to 3.3.1 just soime days ago without any kind of issue.

sailxjx commented 6 years ago

@SunYour you should only use plugin.path in 4.0.0, because the launch script of cp-kafka-connect-base image will reset the classpath.

I solve this problem by using an alias instead of the complete connector name, such as 'MongoSourceConnector'. However, this may still become an issue in 4.0, because the aliases may conflict and the complete connector name worked in 3.2.0.

SunYour commented 6 years ago

Oh, how did you solve it using an alias, can you provide an example of the configuration?

sailxjx commented 6 years ago

This is an example of my connector's config

{
  "connector.class": "MongoSourceConnector",
  "topic.prefix": "mongo_test",
  "tasks.max": "8",
  "schema.name": "mongo_test_schema",
  "name": "mongo_source_test"
}

the framework will create an alias for every connector class, which is the class name without package name.

SunYour commented 6 years ago

Ah, I see @sailxjx. I thought you meant some alias-creating-step prior to changing the class name to only contain the rightmost part of the complete class name.

I did as you suggested, and now it works! Thanks a lot! Also added the CONNECT_PLUGIN_PATH like: CONNECT_PLUGIN_PATH: "/usr/share/java"

Not sure if it's actually needed, though...

sailxjx commented 6 years ago

@SunYour you can discard the plugin.path option in 3.2.0 if you put your connector in path '/usr/share/java'. But you must explicit define the plugin.path in 4.0.0.

woodlee commented 6 years ago

FWIW I hit the same issue on 4.0.0, and resolved it by only setting the env variable CONNECT_PLUGIN_PATH to /usr/share/java/ (as described by @SunYour). The alias wasn't needed in my case, which was using the S3 sink plugin.