2017-01-27 5 views
1

ich diese Fehlermeldung erhalten, wenn das Programm ausgeführt wird:Exception in thread "main" java.lang.NoSuchMethodError: org.apache.commons.csv.CSVParser.parse

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.commons.csv.CSVParser.parse 

Dies ist meine SBT Assembly-Datei:

name := "mytest" 

version := "1.0" 

scalaVersion := "2.10.6" 

organization := "org.test" 

val sparkVersion = "1.6.1" 

val mahoutVersion = "0.12.1" 

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % sparkVersion, 
    "org.apache.spark" %% "spark-mllib" % sparkVersion, 
    // Mahout's Spark libs 
    "org.apache.mahout" %% "mahout-math-scala" % mahoutVersion, 
    "org.apache.mahout" %% "mahout-spark" % mahoutVersion 
    exclude("org.apache.spark", "spark-core_2.10"), 
    "org.apache.mahout" % "mahout-math" % mahoutVersion, 
    "org.apache.mahout" % "mahout-hdfs" % mahoutVersion 
    exclude("com.thoughtworks.xstream", "xstream") 
    exclude("org.apache.hadoop", "hadoop-client"), 
    // other external libs 
    "com.databricks" % "spark-csv_2.10" % "1.3.2", 
    "com.github.nscala-time" %% "nscala-time" % "2.16.0" 
    exclude("org.apache.commons", "commons-csv"), 
    "org.elasticsearch" % "elasticsearch" % "2.3.0", 
    "org.elasticsearch" % "elasticsearch-spark_2.10" % "2.3.0" 
    exclude("org.apache.spark", "spark-catalyst_2.10") 
    exclude("org.apache.spark", "spark-sql_2.10")) 

resolvers += "typesafe repo" at " http://repo.typesafe.com/typesafe/releases/" 

resolvers += Resolver.mavenLocal 

assemblyMergeStrategy in assembly := { 
    case "plugin.properties" => MergeStrategy.discard 
    case PathList("org", "joda", "time", "base", "BaseDateTime.class") => MergeStrategy.first 
    case PathList("org", "apache", "commons", "csv", "CSVParser.class") => MergeStrategy.first 
    case PathList("org", "apache", "commons", "csv", "CSVPrinter.class") => MergeStrategy.first 
    case PathList("org", "apache", "commons", "csv", "ExtendedBufferedReader.class") => MergeStrategy.last 
    case PathList(ps @ _*) if ps.last endsWith "package-info.class" => 
    MergeStrategy.first 
    case x => 
    val oldStrategy = (assemblyMergeStrategy in assembly).value 
    oldStrategy(x) 
} 

ich habe auch getestet "com.databricks" % "spark-csv_2.10" % "1.5.0" und "com.databricks" % "spark-csv_2.10" % "1.4.0", aber der gleiche Fehler erscheint die ganze Zeit. Ich weiß, dass es etwas mit Abhängigkeiten zu tun hat. Muss ich eine andere Bibliothek hinzufügen?

+0

Sie ziehen fast sicher eine inkompatible Version von 'commons-csv' als transitive Abhängigkeit ein. Ich würde vorschlagen, alle nicht direkten Abhängigkeiten von Ihren Deklarationen zu entfernen (die Dinge, die Sie nicht direkt aus Ihrem Code referenzieren), und auch die Zeilen "exclude" entfernen. – jkinkead

Antwort

0

Dies sieht wie ein problematischer Klassenpfad aus.

Ich würde vermeiden, mit "AssemblyMergeStrategy" den Klassenpfad wie folgt zu beheben. Es funktioniert gut, wenn Sie Konfigurationsdateikonflikte haben, wie log4j, aber wenn Sie diese Art von Chaos haben, ist es wirklich nicht das richtige Werkzeug für den Job.

vorgeschlagene Lösung: Verwendung exclude("org.apache.commons", "commons-csv") in allen Abhängigkeiten, die commons-csv verwenden. Lassen Sie nur dasjenige aus, das Sie tatsächlich brauchen (in diesem Fall das von funken).

Ich würde insgesamt versuchen, den Klassenpfad mit Ausschlussregeln zu beheben, ohne "AssemblyMergeStrategy" zu verwenden.

+0

Danke. Könnten Sie bitte ein Beispiel 'libraryDependencies' posten, das anzeigt, was Sie mit' 'sagen, nur dasjenige auslassen, das Sie tatsächlich brauchen (in diesem Fall das von funken)' '? – Dinosaurius

Verwandte Themen