Защо NoClassDefFoundError се хвърля с run, но работи добре с dist?

Преди да задам въпроса, бях прочел въпроса Play framework java. lang.NoClassDefFoundError само в режим dev и няколко други публикации. Не ми помогнаха да реша проблема си.

Създадох проект с помощта на Typesafe Activator 1.2.12 и шаблон play-scala. Използвах и Slick 2.1.0.

Искам да вградя h2 база данни с разширение h2gis в игра.

Когато проектът за възпроизвеждане се стартира с помощта на activator run, в браузъра се показва следното Execution exception:

въведете описание на изображението тук

Следното проследяване на стека е на конзолата:

18013 [play-akka.actor.default-dispatcher-3] ERROR application -

! @6kmnab7c4 - Internal server error, for (GET) [/2] ->

@6kmnab7c4: Execution exception in null:null
    at play.api.Application$class.handleError(Application.scala:296)
    at play.api.DefaultApplication.handleError(Application.scala:402)
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$14$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:205)
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$14$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:202)
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)
    at scala.util.Failure$$anonfun$recover$1.apply(Try.scala:215)
    at scala.util.Try$.apply(Try.scala:191)
    at scala.util.Failure.recover(Try.scala:215)
    at scala.concurrent.Future$$anonfun$recover$1.apply(Future.scala:324)
    at scala.concurrent.Future$$anonfun$recover$1.apply(Future.scala:324)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
    at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:46)
    at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40)
    at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248)
    at scala.concurrent.Promise$class.complete(Promise.scala:55)
    at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23)
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41)
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.lang.RuntimeException: java.lang.NoClassDefFoundError: com/vividsolutions/jts/io/ParseException
    at play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:523)
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:130)
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:130)
    at play.utils.Threads$.withContextClassLoader(Threads.scala:21)
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:129)
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:128)
    at scala.Option.map(Option.scala:145)
    at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:128)
    at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:121)
    at play.api.libs.iteratee.DoneIteratee$$anonfun$mapM$2.apply(Iteratee.scala:705)
    at play.api.libs.iteratee.DoneIteratee$$anonfun$mapM$2.apply(Iteratee.scala:705)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
    ... 6 more
Caused by: java.lang.NoClassDefFoundError: com/vividsolutions/jts/io/ParseException
    at org.h2.value.DataType.convertToValue(DataType.java:1039)
    at org.h2.engine.FunctionAlias$JavaMethod.getValue(FunctionAlias.java:500)
    at org.h2.expression.JavaFunction.getValue(JavaFunction.java:39)
    at org.h2.expression.JavaFunction.optimize(JavaFunction.java:63)
    at org.h2.expression.JavaFunction.optimize(JavaFunction.java:58)
    at org.h2.expression.Function.optimize(Function.java:2104)
    at org.h2.command.dml.Select.prepare(Select.java:831)
    at org.h2.command.Parser.prepareCommand(Parser.java:248)
    at org.h2.engine.Session.prepareLocal(Session.java:442)
    at org.h2.engine.Session.prepareCommand(Session.java:384)
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188)
    at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:73)
    at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:665)
    at scala.slick.jdbc.JdbcBackend$SessionDef$class.prepareStatement(JdbcBackend.scala:152)
    at scala.slick.jdbc.JdbcBackend$BaseSession.prepareStatement(JdbcBackend.scala:389)
    at scala.slick.jdbc.StatementInvoker.results(StatementInvoker.scala:32)
    at scala.slick.jdbc.StatementInvoker.iteratorTo(StatementInvoker.scala:22)
    at scala.slick.jdbc.Invoker$class.foreach(Invoker.scala:64)
    at scala.slick.jdbc.StatementInvoker.foreach(StatementInvoker.scala:16)
    at scala.slick.jdbc.Invoker$class.firstOption(Invoker.scala:29)
    at scala.slick.jdbc.StatementInvoker.firstOption(StatementInvoker.scala:16)
    at scala.slick.jdbc.Invoker$class.first(Invoker.scala:36)
    at scala.slick.jdbc.StatementInvoker.first(StatementInvoker.scala:16)
    at controllers.Application$$anonfun$hi$1$Global$2$$anonfun$onStart$1.apply(Application.scala:45)
    at controllers.Application$$anonfun$hi$1$Global$2$$anonfun$onStart$1.apply(Application.scala:39)
    at scala.slick.backend.DatabaseComponent$DatabaseDef$class.withSession(DatabaseComponent.scala:34)
    at scala.slick.jdbc.JdbcBackend$DatabaseFactoryDef$$anon$4.withSession(JdbcBackend.scala:61)
    at controllers.Application$$anonfun$hi$1$Global$2$.onStart(Application.scala:39)
    at controllers.Application$$anonfun$hi$1.apply(Application.scala:61)
    at controllers.Application$$anonfun$hi$1.apply(Application.scala:27)
    at play.api.mvc.ActionBuilder$$anonfun$apply$17.apply(Action.scala:464)
    at play.api.mvc.ActionBuilder$$anonfun$apply$17.apply(Action.scala:464)
    at play.api.mvc.ActionBuilder$$anonfun$apply$16.apply(Action.scala:433)
    at play.api.mvc.ActionBuilder$$anonfun$apply$16.apply(Action.scala:432)
    at play.api.mvc.Action$.invokeBlock(Action.scala:556)
    at play.api.mvc.Action$.invokeBlock(Action.scala:555)
    at play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:518)
    ... 18 more
Caused by: java.lang.ClassNotFoundException: com.vividsolutions.jts.io.ParseException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 55 more

Въпреки това, ако изпълня activator dist и стартирам приложението, то работи добре (!)

Файлът jar за h2 е в lib и в препратката на sbt и без използване на h2gis не възниква грешка.

Изходният код на проекта е в GitHub като проект weird-error. Използвайте проекта, за да се изправите срещу грешката.

Актуализация:

Ето изхода за проследяване с команда ./activator run -J-XX:+TraceClassLoading Поставям само част от него, изглежда CoordinateArraySequence повдига изключението.

[Loaded scala.slick.util.ReadAheadIterator$class from file:/Users/myusername/.ivy2/cache/com.typesafe.slick/slick_2.11/bundles/slick_2.11-2.1.0.jar]
[Loaded scala.slick.jdbc.SQLInterpolation$ from file:/Users/myusername/.ivy2/cache/com.typesafe.slick/slick_2.11/bundles/slick_2.11-2.1.0.jar]
[Loaded scala.slick.jdbc.SQLInterpolationResult from file:/Users/myusername/.ivy2/cache/com.typesafe.slick/slick_2.11/bundles/slick_2.11-2.1.0.jar]
[Loaded scala.slick.jdbc.GetResult$GetString$ from file:/Users/myusername/.ivy2/cache/com.typesafe.slick/slick_2.11/bundles/slick_2.11-2.1.0.jar]
[Loaded scala.slick.jdbc.Invoker$$anonfun$firstOption$1 from file:/Users/myusername/.ivy2/cache/com.typesafe.slick/slick_2.11/bundles/slick_2.11-2.1.0.jar]
[Loaded com.vividsolutions.jts.io.WKTReader from file:/Users/myusername/p/scala/weird-error/lib/jts-1.13.jar]
[Loaded com.vividsolutions.jts.geom.impl.CoordinateArraySequence from file:/Users/myusername/p/scala/weird-error/lib/jts-1.13.jar]
[Loaded com.vividsolutions.jts.util.Assert from file:/Users/myusername/p/scala/weird-error/lib/jts-1.13.jar]
[Loaded com.vividsolutions.jts.util.AssertionFailedException from file:/Users/myusername/p/scala/weird-error/lib/jts-1.13.jar]
[Loaded scala.util.Failure$$anonfun$recover$1 from file:/Users/myusername/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.1.jar]
[Loaded play.api.Application$$anonfun$4 from file:/Users/myusername/.ivy2/cache/com.typesafe.play/play_2.11/jars/play_2.11-2.3.7.jar]
[Loaded play.core.SourceMapper$$anonfun$sourceFor$1 from file:/Users/myusername/.ivy2/cache/com.typesafe.play/play_2.11/jars/play_2.11-2.3.7.jar]
[Loaded scala.collection.IndexedSeqOptimized$$anonfun$1 from file:/Users/myusername/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.1.jar]
[Loaded play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anon$1$$anon$2$$anonfun$sourceOf$1 from file:/Users/myusername/.ivy2/cache/com.typesafe.pla
y/play_2.11/jars/play_2.11-2.3.7.jar]
[Loaded scala.Option$$anonfun$orNull$1 from file:/Users/myusername/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.1.jar]
[Loaded play.PlayReloader$$anon$1$$anonfun$findSource$1 from file:/Users/myusername/.ivy2/cache/scala_2.10/sbt_0.13/com.typesafe.play/sbt-plugin/jars/sbt-plugin-2.3.7.jar]
[Loaded play.PlayReloader$$anon$1$$anonfun$findSource$1$$anonfun$apply$8 from file:/Users/myusername/.ivy2/cache/scala_2.10/sbt_0.13/com.typesafe.play/sbt-plugin/jars/sbt-plug
in-2.3.7.jar]
[Loaded play.PlayReloader$$anon$1$$anonfun$findSource$1$$anonfun$apply$8$$anonfun$apply$9 from file:/Users/myusername/.ivy2/cache/scala_2.10/sbt_0.13/com.typesafe.play/sbt-plu
gin/jars/sbt-plugin-2.3.7.jar]
[Loaded play.PlayReloader$$anon$1$$anonfun$findSource$1$$anonfun$apply$8$$anonfun$apply$10 from file:/Users/myusername/.ivy2/cache/scala_2.10/sbt_0.13/com.typesafe.play/sbt-pl
ugin/jars/sbt-plugin-2.3.7.jar]
[Loaded play.PlayReloader$$anon$1$$anonfun$findSource$1$$anonfun$apply$11 from file:/Users/myusername/.ivy2/cache/scala_2.10/sbt_0.13/com.typesafe.play/sbt-plugin/jars/sbt-plu
gin-2.3.7.jar]
[Loaded play.PlayReloader$$anon$1$$anonfun$findSource$2 from file:/Users/myusername/.ivy2/cache/scala_2.10/sbt_0.13/com.typesafe.play/sbt-plugin/jars/sbt-plugin-2.3.7.jar]
[Loaded play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anon$1$$anon$2$$anonfun$sourceOf$2 from file:/Users/myusername/.ivy2/cache/com.typesafe.pla
y/play_2.11/jars/play_2.11-2.3.7.jar]
[Loaded play.core.SourceMapper$$anonfun$sourceFor$2 from file:/Users/myusername/.ivy2/cache/com.typesafe.play/play_2.11/jars/play_2.11-2.3.7.jar]
[Loaded play.api.Application$$anonfun$handleError$1 from file:/Users/myusername/.ivy2/cache/com.typesafe.play/play_2.11/jars/play_2.11-2.3.7.jar]
[Loaded play.api.Application$$anonfun$handleError$2 from file:/Users/myusername/.ivy2/cache/com.typesafe.play/play_2.11/jars/play_2.11-2.3.7.jar]
[Loaded scala.collection.immutable.StringLike$$anon$1 from file:/Users/myusername/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.1.jar]
[Loaded scala.collection.immutable.StringLike$$anonfun$stripMargin$1 from file:/Users/myusername/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.1.jar]
18361 [play-akka.actor.default-dispatcher-2] ERROR application -

! @6kpj6pec5 - Internal server error, for (GET) [/2] ->

person worldterminator    schedule 06.01.2015    source източник
comment
NoClassDefFoundError обикновено се появява, ако има грешна версия на клас. Например стара версия на jts jar файла.   -  person Thomas Mueller    schedule 11.01.2015
comment
@ThomasMueller Прекомпилирам изходния код на jts. Не помага. Все същата грешка.   -  person worldterminator    schedule 13.01.2015
comment
Е, може би версията е твърде нова. H2 използва версия 1.13 мисля.   -  person Thomas Mueller    schedule 13.01.2015
comment
Бихте ли могли да стартирате отново с VM опцията -XX:+TraceClassLoading (като се има предвид, че използвате Sun/Oracle VM)?   -  person stefan.schwetschke    schedule 14.01.2015
comment
@ThomasMueller Използвам точно същата версия като H2gis.   -  person worldterminator    schedule 18.01.2015
comment
Изглежда, че имате следния проблем: По време на стартиране някои стойности се четат от вашата база данни h2. Изглежда има проблем по време на анализиране и Java/Scala се опитва да повдигне изключение от тип com.vividsolutions.jts.io.ParseException. Но поради някои проблеми със зареждащия клас, Java VM не може да зареди съответния клас. Така че основната причина е, че невалидните данни са базата данни h2. Проблемът по време на докладването за грешка следва след тази грешка. За съжаление проблемът със зареждащото устройство на класове не е част от извадката за проследяване, която сте публикували, така че мога само да спекулирам по този въпрос.   -  person stefan.schwetschke    schedule 19.01.2015
comment
@stefan.schwetschke Здравей, следата е доста дълга. Можете да го видите чрез връзка: raw.githubusercontent.com/xchen -tian/weird-error/master/   -  person worldterminator    schedule 22.01.2015


Отговори (1)


Опитайте да добавите тези зависимости към вашия файл build.sbt, вместо да поставяте jar в lib.

"com.typesafe.slick" %% "slick" % "2.1.0",
"org.orbisgis" % "h2gis" % "1.1.0",
"com.vividsolutions" % "jts" % "1.13"

в режим dev, play sbt ще използва множество зареждащи класове, за да поддържа горещо презареждане, докато след dist ще има само един зареждащ класове, който да обработва вашия проект. С това казано, поставянето на всички неща на едно и също място може да реши проблема ви.

person NSF    schedule 18.01.2015
comment
Пробвах и не се получи. Изглежда org.orbisgis % h2gis % 1.1.0 няма нищо вътре. Вместо това използвам org.orbisgis % h2-dist % 1.1.0. - person worldterminator; 21.01.2015