@@ -81,27 +81,46 @@ object BrokerServer {
8181 val serverClass = loader.loadClass(" kafka.server.KafkaServerStartable" )
8282 val configClass = loader.loadClass(" kafka.server.KafkaConfig" )
8383
84- val props : Properties = this .props(options, " server.properties" )
85- val config : Object = configClass.getConstructor(classOf [Properties ]).newInstance(props).asInstanceOf [Object ]
84+ val config : Object = newKafkaConfig(this .props(options, " server.properties" ))
8685 val server : Object = serverClass.getConstructor(configClass).newInstance(config).asInstanceOf [Object ]
8786
8887 server
8988 }
9089
9190 def startReporters (options : util.Map [String , String ]): Object = {
92- val configClass = loader.loadClass(" kafka.server.KafkaConfig" )
93-
94- val props : Properties = this .props(options, " server.properties" )
95- val config : Object = configClass.getConstructor(classOf [Properties ]).newInstance(props).asInstanceOf [Object ]
96-
9791 val metricsReporter = loader.loadClass(" kafka.metrics.KafkaMetricsReporter$" ).getField(" MODULE$" ).get(null )
9892 val metricsReporterClass = metricsReporter.getClass
99- val verifiableProps = config.getClass.getMethod(" props" ).invoke(config)
93+
94+ val props = this .props(options, " server.properties" )
95+ val verifiablePropsClass : Class [_] = loader.loadClass(" kafka.utils.VerifiableProperties" )
96+ val verifiableProps : Object = verifiablePropsClass.getConstructor(classOf [Properties ]).newInstance(props).asInstanceOf [Object ]
97+
10098 metricsReporterClass.getMethod(" startReporters" , verifiableProps.getClass).invoke(metricsReporter, verifiableProps)
10199 }
100+
101+ private def newKafkaConfig (props : Properties ): Object = {
102+ val configClass = loader.loadClass(" kafka.server.KafkaConfig" )
103+ var config : Object = null
102104
105+ // in kafka <= 0.8.x constructor is KafkaConfig(java.util.Properties)
106+ try { config = configClass.getConstructor(classOf [Properties ]).newInstance(props).asInstanceOf [Object ] }
107+ catch { case e : NoSuchMethodException => }
108+
109+ if (config == null ) {
110+ // in kafka 0.9.0.0 constructor is KafkaConfig(java.util.Map[_,_])
111+ val map : util.Map [_,_] = props.toMap.asInstanceOf [Map [_,_]]
112+ try { config = configClass.getConstructor(classOf [util.Map [String , String ]]).newInstance(map).asInstanceOf [Object ] }
113+ catch { case e : NoSuchMethodError => }
114+ }
115+
116+ if (config == null ) throw new IllegalStateException (" Can't create KafkaConfig. Unsupported kafka distro?" )
117+ config
118+ }
119+
103120 def configureLog4j (options : util.Map [String , String ]): Unit = {
121+ System .setProperty(" kafka.logs.dir" , " " + new File (Distro .dir, " log" ))
104122 val props : Properties = this .props(options, " log4j.properties" )
123+
105124 val configurator : Class [_] = loader.loadClass(" org.apache.log4j.PropertyConfigurator" )
106125 configurator.getMethod(" configure" , classOf [Properties ]).invoke(null , props)
107126 }
@@ -141,13 +160,31 @@ object BrokerServer {
141160 // This is required, because current jar have classes incompatible with classes from kafka distro.
142161 class Loader (urls : Array [URL ]) extends URLClassLoader (urls) {
143162 val snappyHackedClasses = Array [String ](" org.xerial.snappy.SnappyNativeAPI" , " org.xerial.snappy.SnappyNative" , " org.xerial.snappy.SnappyErrorCode" )
163+ var snappyHackEnabled = false
164+ checkSnappyVersion
165+
166+ def checkSnappyVersion {
167+ var jarName : String = null
168+ for (url <- urls) {
169+ val fileName = new File (url.getFile).getName
170+ if (fileName.matches(" snappy.*jar" )) jarName = fileName
171+ }
172+
173+ if (jarName == null ) return
174+ val hIdx = jarName.lastIndexOf(" -" )
175+ val extIdx = jarName.lastIndexOf(" .jar" )
176+ if (hIdx == - 1 || extIdx == - 1 ) return
177+
178+ val version = new Util .Version (jarName.substring(hIdx + 1 , extIdx))
179+ snappyHackEnabled = version.compareTo(new Util .Version (1 ,1 ,0 )) <= 0
180+ }
144181
145182 override protected def loadClass (name : String , resolve : Boolean ): Class [_] = {
146183 getClassLoadingLock(name) synchronized {
147184 // Handle Snappy class loading hack:
148185 // Snappy injects 3 classes and native lib to root ClassLoader
149186 // See - org.xerial.snappy.SnappyLoader.injectSnappyNativeLoader
150- if (snappyHackedClasses.contains(name))
187+ if (snappyHackEnabled && snappyHackedClasses.contains(name))
151188 return super .loadClass(name, true )
152189
153190 // Check class is loaded
0 commit comments