2017-07-26 1 views
0

Meine Anwendung verwendet commons-configuration2 und commons-beanutils1.9, aber wenn ich versuche, meine Anwendung Gläser für Funken Streaming-Jobs zu verwenden, wirft folgende Ausnahme.Verwenden von commons-configuration2 und commons-beanutils-1.9 mit Apache function 1.6

java.lang.NoSuchMethodError: org.apache.commons.beanutils.PropertyUtilsBean.addBeanIntrospector (Lorg/Apache/common/Beanutils/BeanIntrospector;) V bei org.apache.commons.configuration2.beanutils.BeanHelper.initBeanUtilsBean (BeanHelper.java:631) bei org.apache.commons.configuration2.beanutils.BeanHelper. (BeanHelper.java:89) bei java.lang.Class.forName0 (native Methode) bei java.lang.Class.forName (Class.java:264) bei com.sun.proxy. $ Proxy23. (Unknown Source) bei sun.reflect.NativeConstructorAccessorImpl.newInstance0 (Mutter Methode) bei sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) unter sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) bei java.lang.reflect.Constructor.newInstance (Constructor.java:423) bei java.lang.reflect.Proxy.newProxyInstance (Proxy.java: 739) bei org.apache.commons.configuration2.builder.fluent.Parameters.createParametersProxy (Parameters.java:294) bei org.apache.commons.configuration2.builder.fluent.Parameters.fileBased (Parameters.java:185)

Und hier ist mein build.sbt

libraryDependencies ++= Seq(
     "org.apache.commons" % "commons-configuration2" % "2.0", 
     "commons-beanutils" % "commons-beanutils" % "1.9.2", 
     "com.databricks" % "spark-avro_2.10" % "2.0.1", 
     "com.databricks" % "spark-csv_2.10" % "1.4.0", 
     "org.apache.spark" % "spark-sql_2.10" % "1.5.0" % "provided", 
     "org.apache.spark" % "spark-hive_2.10" % "1.4.1" % "provided", 
     "org.apache.spark" % "spark-core_2.10" % "1.4.1" % "provided", 
     "com.amazonaws" % "aws-java-sdk" % "1.10.61", 
     "org.apache.logging.log4j" % "log4j-api" % "2.6.2", 
     "org.jasypt" % "jasypt" % "1.9.2", 
     "commons-codec" % "commons-codec" % "1.8", 
     "org.apache.kafka" % "kafka-clients" % "0.10.0.0", 
     "org.apache.spark" % "spark-streaming-kafka_2.10" % "1.6.3", 
     "org.apache.spark" % "spark-streaming_2.10" % "1.6.3" excludeAll(ExclusionRule(organization = "commons-beanutils")) 

    ) 

    dependencyOverrides ++= Set(
     "com.fasterxml.jackson.core" % "jackson-databind" % "2.4.4", 
     "org.apache.logging.log4j" % "log4j-api" % "2.6.2", 
     "org.apache.logging.log4j" % "log4j-core" % "2.6.2", 
     "org.apache.commons" % "commons-configuration2" % "2.0", 
     "commons-beanutils" % "commons-beanutils" % "1.9.2" 
    ) 

assemblyMergeStrategy in assembly := { 
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard 
    case x => MergeStrategy.first 
} 

Wie kann ich sicherstellen, dass es commons-Beanutils-1.9.2 verwendet Inste ad von commons-beanutils-1.7 oder commons-beanutils-core-1.8 welche sind Teil von hadoop-common?

Antwort

0

Ohne unerwünschte Gläser in den Einstellungen des Projekts funktioniert für mich:

... 
.settings(assemblyExcludedJars in assembly := { 
    val cp = (fullClasspath in assembly).value 

    val excludes = Set(
     "commons-beanutils-core-1.8.0.jar", 
     "commons-beanutils-1.7.0.jar", 
     "commons-beanutils-1.8.0.jar" 
    ) 
    cp.filter{jar => excludes.contains(jar.data.getName)} 
    }) 
+0

Hallo Denis, Vielen Dank für die Antwort, aber für mich ist es immer noch die Ausnahme zur Laufzeit zu geben. Ich überprüfe die PropertyUtilsBean-Klasse aus dem über Assembly generierten Uber-JAR und korrespondiert nur mit commons-beanutils-1.9.2.jar, aber zur Laufzeit, wenn ich funke-submit, dann beschwert es sich über die addBeanIntrospector-Methode. Wie sagen wir Spark, um die Klassendatei von Uber jar zu verwenden, anstatt eines mit Spark-Umgebung zur Laufzeit? – kallam

+0

Haben Sie das Shading versucht (d. H. Das Paket während der Assemblierung grundlegend umbenannt und alle Verweise auf den alternativen Paketnamen korrigiert)? Es kann in diesem Fall funktionieren. Weitere Informationen finden Sie unter https://github.com/sbt/sbt-assembly#shading. Leider funktioniert es nicht immer, z.B. wenn jar Code enthält, der vom ursprünglichen Paketnamen abhängt. Insbesondere hat es mir nicht geholfen, zwei verschiedene AWS SDK-Versionen im selben Projekt zu verwenden. Ich löste das, indem ich einen benutzerdefinierten Klassenlader für meine Bibliothek schrieb, um die gleichen Symbole in verschiedenen Versionen derselben Bibliothek getrennt zu halten. –

+0

Dank Denis, für Ihren Vorschlag, Schattierung zu verwenden, funktioniert es gut, nachdem ich Schattierung für die spezifizierten Gläser/Pakete anwandte. Ich habe noch eine Frage, können wir Schattierung auf die Pakete anwenden, die in den Gläsern im lib-Ordner von sbt-Projekt enthalten sind? Ich muss die Anwendungs-Jars in das interne Maven-Repository hochladen, um Shading auf diese Jars anzuwenden. Wenn es möglich ist, auf die im lib-Ordner platzierten Gefäße anzuwenden, würde dies mein Problem lösen, ohne auf nexus-Repository hochzuladen. – kallam

Verwandte Themen