2017-01-27 8 views
1

Я получаю эту ошибку при запуске программы:Исключение в потоке «главный» java.lang.NoSuchMethodError: org.apache.commons.csv.CSVParser.parse

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

Это мой файл SBT сборки:

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) 
} 

Я также протестировали "com.databricks" % "spark-csv_2.10" % "1.5.0" и "com.databricks" % "spark-csv_2.10" % "1.4.0", но та же ошибка появляется все время. Я знаю, что это имеет какое-то отношение к зависимостям. Нужно ли добавлять любую другую библиотеку?

+0

Вы почти наверняка вытягиваете несовместимую версию 'commons-csv' в качестве транзитивной зависимости. Я бы предложил удалить все непрямые зависимости из ваших объявлений (те вещи, на которые вы не ссылаетесь непосредственно из вашего кода), а также удаление строк 'exclude'. – jkinkead

ответ

0

Это похоже на проблемный путь класса.

Я бы не использовал «assemblyMergeStrategy», чтобы исправить путь класса таким образом. Он работает нормально, если у вас есть конфликты конфигурационных файлов, например log4j, но если у вас такой беспорядок, это действительно не правильный инструмент для работы.

Предлагаемое решение: Использование exclude("org.apache.commons", "commons-csv") во всех зависимостей, которые используют commons-csv. Оставьте только тот, который вам действительно нужен (в этом случае один из искры).

В целом я попытаюсь исправить путь класса с правилами исключения, не используя «assemblyMergeStrategy».

+0

Спасибо. Не могли бы вы разместить образец 'libraryDependencies', показывающий, что вы имеете в виду,« оставьте только тот, который вам действительно нужен (в данном случае один из искры) »? – Dinosaurius