2017-07-26 96 views
0

我的應用程序使用的是commons-configuration2和commons-beanutils1.9,但是當我嘗試使用我的應用程序罐進行火花流作業時,它拋出以下異常。使用commons-configuration2和commons-beanutils-1.9和Apache spark 1.6

java.lang.NoSuchMethodError:org.apache.commons.beanutils.PropertyUtilsBean.addBeanIntrospector(Lorg /阿帕奇/公地/ BeanUtils的/ BeanIntrospector)在org.apache.commons.configuration2.beanutils.BeanHelper.initBeanUtilsBean V ( BeanHelper.java:631) 在org.apache.commons.configuration2.beanutils.BeanHelper。(BeanHelper.java:89) 在java.lang.Class.forName0(本機方法) 在java.lang.Class.forName( Class.java:264) 在com.sun.proxy。$ Proxy23。(來源不明) 在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本機方法) 在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 java.lang.reflect.Proxy.newProxyInstance(Proxy.java: 739) at org.apache.commons.configuration2.builder.fluent.Parameters.createParametersProxy(Parameters.java:294) at org.apache.commons.configuration2.builder.fluent.Parameters.fileBased(Parameters.java:185)

這裏是我的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 
} 

如何確保它使用的commons-BeanUtils的-1.9.2 inste commons-beanutils-1.7或commons-beanutils-core-1.8是hadoop-common的一部分嗎?

回答

0

剔除項目的設置不必要的罐子對我的作品:

... 
.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

嗨丹尼斯, 感謝您的答覆,但對我來說仍是給予在運行時異常。我從程序集生成的uber jar中檢查PropertyUtilsBean類,它只對應於commons-beanutils-1.9.2.jar,但是在運行時我做了spark-submit,然後它在抱怨addBeanIntrospector方法。我們如何告訴spark使用來自uber jar的類文件,而不是在運行時帶有spark環境? – kallam

+0

您是否嘗試着色(即在組件創建過程中基本上重命名包並修復所有引用以使用備用包名稱)?它可能在這種情況下工作。查看https://github.com/sbt/sbt-assembly#shading瞭解更多詳情。 不幸的是它並不總是有效的,例如如果jar包含依賴於原始軟件包名稱的代碼。特別是,它並沒有幫助我在同一個項目中使用兩個不同的AWS SDK版本。我通過爲我的庫編寫自定義類加載器來解決此問題,以將相同庫的不同版本中的相同符號分開。 –

+0

非常感謝Denis,因爲你建議使用陰影,所以在我爲指定的罐子/包裝應用陰影后它工作正常。我還有一個問題,我們可以在sbt項目的lib文件夾中的罐子上包含的包裝上應用陰影嗎?我必須將應用程序jar上傳到內部maven存儲庫以在這些jar上應用陰影。如果可以應用於放置在lib文件夾中的罐子,那麼它將解決我的問題,而無需上傳到nexus存儲庫。 – kallam