0

Grape で kafka-clients 依存関係をロードし、StringSerializer をインスタンス化できますが、Class.forName は失敗します。なぜこうなった?

$ groovysh
Groovy Shell (1.8.6, JVM: 1.8.0_131)
-------------------------------------------------------------------------
groovy:000> import static groovy.grape.Grape.grab
===> [import static groovy.grape.Grape.grab]
groovy:000> grab group:'org.apache.kafka', module:'kafka-clients', version:'0.11.0.0'
===> null
groovy:000> new org.apache.kafka.common.serialization.StringSerializer()
===> org.apache.kafka.common.serialization.StringSerializer@2f67b837
groovy:000> Class.forName "org.apache.kafka.common.serialization.StringSerializer"
ERROR java.lang.ClassNotFoundException:
org.apache.kafka.common.serialization.StringSerializer
        at java_lang_Class$forName.call (Unknown Source)
        at groovysh_evaluate.run (groovysh_evaluate:3)
        ...

Serializer インスタンスがKafkaProducer コンストラクターに渡されたとしても、KafkaProducer をインスタンス化するには明らかに Serializer をその String クラス名からロードできる必要があるため、これは私をイライラさせます。

groovy:000> ss = new org.apache.kafka.common.serialization.StringSerializer()
===> org.apache.kafka.common.serialization.StringSerializer@4331d187
groovy:000> producer = new KafkaProducer(props, ss, ss)
ERROR org.apache.kafka.common.config.ConfigException:
Invalid value org.apache.kafka.common.serialization.StringSerializer for configuration key.serializer: Class org.apache.kafka.common.serialization.StringSerializer could not be found.
        at org.apache.kafka.common.config.ConfigDef.parseType (ConfigDef.java:715)
        at org.apache.kafka.common.config.ConfigDef.parseValue (ConfigDef.java:460)
        at org.apache.kafka.common.config.ConfigDef.parse (ConfigDef.java:453)
        at org.apache.kafka.common.config.AbstractConfig.<init> (AbstractConfig.java:62)
        at org.apache.kafka.common.config.AbstractConfig.<init> (AbstractConfig.java:75)
        at org.apache.kafka.clients.producer.ProducerConfig.<init> (ProducerConfig.java:359)
        at org.apache.kafka.clients.producer.KafkaProducer.<init> (KafkaProducer.java:300)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0 (Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance (Constructor.java:423)
        at org.codehaus.groovy.reflection.CachedConstructor.invoke (CachedConstructor.java:77)
        at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor (ConstructorSite.java:102)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor (CallSiteArray.java:54)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor (AbstractCallSite.java:182)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor (AbstractCallSite.java:198)
        at groovysh_evaluate$_run_closure1.doCall (groovysh_evaluate:7)
        at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke (Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke (CachedMethod.java:90)
        at groovy.lang.MetaMethod.doMethodInvoke (MetaMethod.java:233)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod (ClosureMetaClass.java:272)
        at groovy.lang.MetaClassImpl.invokeMethod (MetaClassImpl.java:877)
        at groovy.lang.MetaClassImpl.invokePropertyOrMissing (MetaClassImpl.java:1093)
        at groovy.lang.MetaClassImpl.invokeMethod (MetaClassImpl.java:1049)
        at groovy.lang.MetaClassImpl.invokeMethod (MetaClassImpl.java:877)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent (PogoMetaClassSite.java:66)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent (CallSiteArray.java:46)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent (AbstractCallSite.java:133)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent (AbstractCallSite.java:141)
        at groovysh_evaluate.run (groovysh_evaluate:4)
        ...

Class.forName を機能させる回避策、または ConfigException (ClassNotFoundException が原因) を回避するその他の方法を探しています。

4

0 に答える 0