Play Framework启动H2数据库浏览器失败问题求助
解决Play Framework在IntelliJ中启动H2浏览器的依赖问题
问题根源
你遇到的object h2 is not a member of package org错误,是因为Play框架默认将数据库驱动(包括H2)标记为Runtime scope,而sbt任务执行时的classpath不包含Runtime依赖,导致无法找到H2的类。
解决方案
方案1:利用Play自带的H2浏览器任务(最简便)
Play的sbt插件已经内置了h2-browser任务,无需修改build.sbt:
- 在IntelliJ右侧打开SBT工具窗口
- 找到你的项目,展开
Tasks→play→ 双击运行h2-browser - 再运行
run任务启动Play应用即可
或者直接在IntelliJ终端执行:
sbt h2-browser run
方案2:修改build.sbt,保留Runtime依赖的同时支持任务调用
如果需要自动在启动应用时打开H2浏览器,可修改build.sbt,通过类加载器动态加载H2(避免将H2带入生产环境):
libraryDependencies += "com.h2database" % "h2" % "2.1.214" % Runtime lazy val startH2Browser = taskKey[Unit]("Starts the H2 Browser") startH2Browser := { val h2Jar = (libraryDependencies.value find (_.name == "h2")).map { dep => (update.value.matching(moduleFilter(dep.organization, dep.name, dep.revision))).head }.getOrElse(throw new Exception("未找到H2依赖")) println("启动H2浏览器...") val classLoader = new java.net.URLClassLoader(Array(h2Jar.toURI.toURL), getClass.getClassLoader) val serverClass = classLoader.loadClass("org.h2.tools.Server") val createWebServer = serverClass.getMethod("createWebServer", classOf[Array[String]]) val server = createWebServer.invoke(null, Array("-web", "-webAllowOthers", "-webPort", "8082")) serverClass.getMethod("start").invoke(server) } playRunHooks += { new play.sbt.PlayRunHook { override def beforeStarted(): Unit = { startH2Browser.value } } }
方案3:临时修改H2依赖Scope(不推荐用于生产)
将H2依赖的Scope改为compile,让sbt任务能直接访问类,但会将H2打包进生产环境:
libraryDependencies += "com.h2database" % "h2" % "2.1.214" % "compile"
修改后你原来写的startH2Browser任务即可正常运行。
内容的提问来源于stack exchange,提问作者MohanaSundaram J
相关产品推荐
相关产品推荐

