java.lang.NoClassDefFoundError при запуске приложения JAR - PullRequest
0 голосов
/ 25 января 2019

Я скомпилировал свое приложение Apache Spark, которое написано на Scala с sbt внутри IntellijIDEA и прекрасно работает при работе внутри IntelliJ.Но когда я компилирую и упаковываю его как файл jar и запускаю на удаленном сервере, я получаю эту ошибку, когда код достигает места, где я пытаюсь создать экземпляр Envelope внутри org / locationtech / jts / geom / Envelope

Exception in thread "main" java.lang.NoClassDefFoundError: org/locationtech/jts/geom/Envelope
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.getDeclaredMethod(Class.java:2128)
at java.io.ObjectStreamClass.getPrivateMethod(ObjectStreamClass.java:1629)
at java.io.ObjectStreamClass.access$1700(ObjectStreamClass.java:79)
at java.io.ObjectStreamClass$3.run(ObjectStreamClass.java:520)...

Я понимаю, что это проблема несовместимости между версиями библиотек, а также знаю, что NoClassDefFoundError означает, что библиотека была доступна во время компиляции и недоступна во время выполнения, но я не могурешить проблему.

Это мой файл build.sbt:

name := "MySpark"
version := "0.1"
scalaVersion := "2.11.6"
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.3.0", "org.locationtech.jts" % "jts-core" % "1.16.0" 
)

Версии Spark и Scala на удаленном компьютере такие же, как в файле build.sbt.

Когда я запускаю evicted в оболочке sbt, я получаю эту информацию, но я не знаю, как использовать эту информацию для решения моей проблемы.

[warn] Found version conflict(s) in library dependencies; some are suspected to be binary incompatible:
[warn]  * io.netty:netty:3.9.9.Final is selected over {3.6.2.Final, 3.7.0.Final}
[warn]      +- org.apache.spark:spark-core_2.11:2.3.0             (depends on 3.9.9.Final)
[warn]      +- org.apache.zookeeper:zookeeper:3.4.6               (depends on 3.6.2.Final)
[warn]      +- org.apache.hadoop:hadoop-hdfs:2.6.5                (depends on 3.6.2.Final)
[warn]  * commons-net:commons-net:2.2 is selected over 3.1
[warn]      +- org.apache.spark:spark-core_2.11:2.3.0             (depends on 2.2)
[warn]      +- org.apache.hadoop:hadoop-common:2.6.5              (depends on 3.1)
[warn]  * com.google.guava:guava:11.0.2 is selected over {12.0.1, 16.0.1}
[warn]      +- org.apache.hadoop:hadoop-yarn-client:2.6.5         (depends on 11.0.2)
[warn]      +- org.apache.hadoop:hadoop-yarn-api:2.6.5            (depends on 11.0.2)
[warn]      +- org.apache.hadoop:hadoop-yarn-common:2.6.5         (depends on 11.0.2)
[warn]      +- org.apache.hadoop:hadoop-yarn-server-nodemanager:2.6.5 (depends on 11.0.2)
[warn]      +- org.apache.hadoop:hadoop-yarn-server-common:2.6.5  (depends on 11.0.2)
[warn]      +- org.apache.hadoop:hadoop-hdfs:2.6.5                (depends on 11.0.2)
[warn]      +- org.apache.curator:curator-framework:2.6.0         (depends on 16.0.1)
[warn]      +- org.apache.curator:curator-client:2.6.0            (depends on 16.0.1)
[warn]      +- org.apache.curator:curator-recipes:2.6.0           (depends on 16.0.1)
[warn]      +- org.apache.hadoop:hadoop-common:2.6.5              (depends on 16.0.1)
[warn]      +- org.htrace:htrace-core:3.0.4                       (depends on 12.0.1)
[warn] Run 'evicted' to see detailed eviction warnings
[info] Here are other dependency conflicts that were resolved:
[info]  * com.thoughtworks.paranamer:paranamer:2.8 is selected over {2.6, 2.3}
[info]      +- com.fasterxml.jackson.module:jackson-module-paranamer:2.7.9 (depends on 2.8)
[info]      +- org.json4s:json4s-core_2.11:3.2.11                 (depends on 2.6)
[info]      +- org.apache.avro:avro:1.7.7 

Ответы [ 2 ]

0 голосов
/ 25 января 2019

попробуйте добавить свои зависимости в команду spark-submit, используя --packages

spark-submit --packages org.locationtech.jts:jts-core:1.16.0 --class labX.applications.ServerTest --executor-memory 2048m --executor-cores 1 --num-executors 17 mySparkApp_2.11-0.1.jar
0 голосов
/ 25 января 2019

Если вы запустите cmd пакета sbt, сгенерированный jar будет содержать только ваши исходные файлы, но не будет сторонней библиотеки.

Так что если вы развернете свой Jar и попытаетесь запустить его.Ваша среда выполнения должна предоставить внешние библиотеки, указанные здесь

libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.3.0", "org.locationtech.jts" % "jts-core" % "1.16.0" 
)

. При запуске приложения Spark "org.apache.spark" %% "spark-core" % "2.3.0" присутствует в вашем пути к среде среды выполнения.spark-submit сделает это за вас."org.locationtech.jts" % "jts-core" % "1.16.0" - это специальная сторонняя библиотека, и по умолчанию я не думаю, что среда выполнения будет включать ее.

Вы должны использовать плагин:

  • sbt-assembly
  • sbt-onejar
  • sbt-native-packager

и настройте его так, чтобы он включал ваши сторонние библиотеки.Таким образом, ваше приложение будет поставлено с необходимыми классами в соответствии с выбранным решением.В этом случае я настоятельно советую вам добавить область provided к библиотекам spark, уже присутствующим в вашей среде выполнения.Он должен исключать их из пакета и предотвращать потенциальные конфликты между вашим пакетом и тем, что уже существует в вашей целевой среде (среде выполнения)

...