Issues with orientdb-2.0-rc1 lucene plugin, embedded in Play Framework

114 views
Skip to first unread message

Bertrand Quenin

unread,
Jan 12, 2015, 11:55:53 AM1/12/15
to orient-...@googlegroups.com
Hi,

I'm having trouble in play framework when trying to use the Lucene plugin. Here is what my Global.scala look like:

import com.orientechnologies.orient.server.OServerMain
import com.tinkerpop.blueprints.impls.orient.OrientGraphFactory
import play.api._

object Global extends GlobalSettings {
  val orientdb = OServerMain.create
  val factory = new OrientGraphFactory("plocal:databases/graphdb", "admin", "admin")

  override def onStart(app: Application) {
    orientdb.startup(getClass.getClassLoader.getResourceAsStream("orientdb-config.xml"))
    orientdb.activate

    factory.setAutoStartTx(false)

    Logger.info("Application has started")
  }

  override def onStop(app: Application) {
    orientdb.shutdown

    Logger.info("Application shutdown...")
  }
}

And here is the result:

->java.lang.NoClassDefFoundError: com/orientechnologies/orient/server/plugin/OServerPluginAbstract
     java.lang.ClassLoader.defineClass1(Native Method)
     java.lang.ClassLoader.defineClass(ClassLoader.java:760)
     java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
     java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
     java.net.URLClassLoader.access$100(URLClassLoader.java:73)
     java.net.URLClassLoader$1.run(URLClassLoader.java:367)
     java.net.URLClassLoader$1.run(URLClassLoader.java:361)
     java.security.AccessController.doPrivileged(Native Method)
     java.net.URLClassLoader.findClass(URLClassLoader.java:360)
     java.lang.ClassLoader.loadClass(ClassLoader.java:424)
     java.lang.ClassLoader.loadClass(ClassLoader.java:357)
     java.lang.Class.forName0(Native Method)
     java.lang.Class.forName(Class.java:344)
     com.orientechnologies.orient.server.plugin.OServerPluginManager.startPluginClass(OServerPluginManager.java:254)
     com.orientechnologies.orient.server.plugin.OServerPluginManager.installDynamicPlugin(OServerPluginManager.java:343)
     com.orientechnologies.orient.server.plugin.OServerPluginManager.updatePlugin(OServerPluginManager.java:194)
     com.orientechnologies.orient.server.plugin.OServerPluginManager.updatePlugins(OServerPluginManager.java:283)
     com.orientechnologies.orient.server.plugin.OServerPluginManager.startup(OServerPluginManager.java:85)
     com.orientechnologies.orient.server.OServer.registerPlugins(OServer.java:820)
     com.orientechnologies.orient.server.OServer.activate(OServer.java:256)
     Global$.onStart(Global.scala:11)
     play.api.GlobalPlugin.onStart(GlobalSettings.scala:220)
     play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:91)
     play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:91)
     scala.collection.immutable.List.foreach(List.scala:383)
     play.api.Play$$anonfun$start$1.apply$mcV$sp(Play.scala:91)
     play.api.Play$$anonfun$start$1.apply(Play.scala:91)
     play.api.Play$$anonfun$start$1.apply(Play.scala:91)
     play.utils.Threads$.withContextClassLoader(Threads.scala:21)
     play.api.Play$.start(Play.scala:90)
     play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:157)
     play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:130)
     scala.Option.map(Option.scala:145)
     play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:130)
     play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:128)
     scala.util.Success.flatMap(Try.scala:230)
     play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:128)
     play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:120)
     scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
     scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
     scala.concurrent.forkjoin.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1361)
     scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
     scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
     scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
     scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)


I'm not sure how to resolve this. It seems that there is some classloader magic failing here, but I'm puzzled on how to solve it.

Thanks,
BQ.

Enrico Risa

unread,
Jan 12, 2015, 12:37:55 PM1/12/15
to orient-...@googlegroups.com
Can you post your build.sbt?

where is located the plugin?

--

---
You received this message because you are subscribed to the Google Groups "OrientDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email to orient-databa...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Bertrand Quenin

unread,
Jan 12, 2015, 2:49:20 PM1/12/15
to orient-...@googlegroups.com, enric...@gmail.com
Sure. Here is my build.sbt:

name := """project"""

version := "1.0.0"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.1"

libraryDependencies ++= Seq(
  //
  // Webjars
  "org.webjars" %% "webjars-play" % "2.3.0-2",
  "org.webjars" % "jquery" % "2.1.1",
  "org.webjars" % "bootswatch-lumen" % "3.2.0",
  "org.webjars" % "emberjs" % "1.9.0",
  "org.webjars" % "emberjs-data" % "1.0.1-beta.11",
  "org.webjars" % "handlebars" % "2.0.0-1",
  //
  // OrientDB
  "com.orientechnologies" % "orientdb-graphdb" % "2.0-rc1"
)

The plugin is located in the "plugins" subfolder which is itself located in the root of the project.

project/build.sbt
project/plugins/orientdb-lucene-2.0-rc1-dist.jar





Bertrand Quenin

unread,
Jan 13, 2015, 8:05:54 AM1/13/15
to orient-...@googlegroups.com, enric...@gmail.com
I've fixed my problem by using the plugin as "embedded" (i.e. adding the dependency explicitely in the build.sbt) and not using the dynamic plugin.

Regards,
BQ.

Mo LOUKILI

unread,
Jan 22, 2015, 1:48:00 AM1/22/15
to orient-...@googlegroups.com
This is due to the plugin classloader since its parent class loader is the main Thread classloader.

I would suggest to change the OServerPluginManager class line 303
pluginClassLoader = new URLClassLoader(new URL[] { url });
by 
pluginClassLoader = new URLClassLoader(new URL[] { url }, OServerPlugin.class.getClassLoader ());  

This will insure that orientdb will work in embedded mode using a different classloader.

Bertrand Quenin

unread,
Jan 22, 2015, 6:13:53 AM1/22/15
to orient-...@googlegroups.com
Ok, I was suspecting something like that, without being able to fix it.

Thanks for the tip!

--

---
You received this message because you are subscribed to a topic in the Google Groups "OrientDB" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/orient-database/ttcTWOadSAk/unsubscribe.
To unsubscribe from this group and all its topics, send an email to orient-databa...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages