Goldfish
unread,Aug 17, 2009, 7:24:34 AM8/17/09Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Sign in to report message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to Lift
I am trying to point my app at an Oracle database, but am getting
ClassNotFound exceptions:
[INFO] Scanning for projects...
[INFO]
------------------------------------------------------------------------
[INFO] Building cims2
[INFO] task-segment: [jetty:run]
[INFO]
------------------------------------------------------------------------
[INFO] Preparing jetty:run
[INFO] [resources:resources {execution: default-resources}]
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered
resources,
i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO] [yuicompressor:compress {execution: default}]
[INFO] nb warnings: 0, nb errors: 0
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Nothing to compile - all classes are up to date
[INFO] [scala:compile {execution: default}]
[INFO] Checking for multiple versions of scala
[INFO] Nothing to compile - all classes are up to date
[INFO] [resources:testResources {execution: default-testResources}]
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered
resources,
i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] [compiler:testCompile {execution: default-testCompile}]
[INFO] Nothing to compile - all classes are up to date
[INFO] [scala:testCompile {execution: default}]
[INFO] Checking for multiple versions of scala
[INFO] Nothing to compile - all classes are up to date
[INFO] [jetty:run {execution: default-cli}]
[INFO] Configuring Jetty for project: cims2
[INFO] Webapp source directory = H:\lift\cims2\src\main\webapp
[INFO] Reload Mechanic: automatic
[INFO] Classes = H:\lift\cims2\target\classes
2009-08-17 07:20:58.078::INFO: Logging to STDERR via
org.mortbay.log.StdErrLog
[INFO] Context path = /
[INFO] Tmp directory = determined at runtime
[INFO] Web defaults = org/mortbay/jetty/webapp/webdefault.xml
[INFO] Web overrides = none
[INFO] web.xml file = H:\lift\cims2\src\main\webapp\WEB-INF\web.xml
[INFO] Webapp directory = H:\lift\cims2\src\main\webapp
[INFO] Starting jetty 6.1.19 ...
2009-08-17 07:20:58.296::INFO: jetty-6.1.19
2009-08-17 07:20:59.000::INFO: No Transaction manager found - if your
webapp re
quires one, please configure one.
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
I put ojdbc.jar in both src/webapp and src/webapp/WEB-INF and it makes
no difference. I dug into the code so that I could figure out how to
use props files instead of editing Boot.scala too much, and managed to
define src/main/resources/default.props, which I can tell is read,
because it is obviously trying to load in
oracle.jdbc.driver.OracleDriver, which came from my props file. My
Boot.scala file looks like:
package bootstrap.liftweb
import _root_.net.liftweb.util._
import _root_.net.liftweb.http._
import _root_.net.liftweb.sitemap._
import _root_.net.liftweb.sitemap.Loc._
import Helpers._
import _root_.net.liftweb.mapper.{DB, ConnectionManager, Schemifier,
DefaultConnectionIdentifier, ConnectionIdentifier}
import _root_.java.sql.{Connection, DriverManager}
import _root_.com.harris.cims.model._
import _root_.javax.servlet.http.{HttpServletRequest}
/**
* A class that's instantiated early and run. It allows the
application
* to modify lift's environment
*/
class Boot {
def boot {
if (!DB.jndiJdbcConnAvailable_?)
DB.defineConnectionManager(DefaultConnectionIdentifier,
DBVendor)
// where to search snippet
LiftRules.addToPackages("com.harris.cims")
Schemifier.schemify(false, Log.infoF _, User, CarrierAccount)
// Build SiteMap
val entries = Menu(Loc("Home", List("index"), "Home")) ::
User.sitemap
LiftRules.setSiteMap(SiteMap(entries:_*))
/*
* Show the spinny image when an Ajax call starts
*/
LiftRules.ajaxStart =
Full(() => LiftRules.jsArtifacts.show("ajax-loader").cmd)
/*
* Make the spinny image go away when it ends
*/
LiftRules.ajaxEnd =
Full(() => LiftRules.jsArtifacts.hide("ajax-loader").cmd)
LiftRules.early.append(makeUtf8)
S.addAround(DB.buildLoanWrapper)
}
/**
* Force the request to be UTF-8
*/
private def makeUtf8(req: HttpServletRequest) {
req.setCharacterEncoding("UTF-8")
}
}
/**
* Database connection calculation
*/
object DBVendor extends ConnectionManager {
private var pool: List[Connection] = Nil
private var poolSize = 0
private val maxPoolSize = 4
private def createOne: Box[Connection] = try {
val driverName: String = Props.get("db.driver") openOr
"org.apache.derby.jdbc.EmbeddedDriver"
val dbUrl: String = Props.get("db.url") openOr
"jdbc:derby:lift_example;create=true"
Class.forName(driverName)
val dm = (Props.get("db.user"), Props.get("db.password")) match {
case (Full(user), Full(pwd)) =>
DriverManager.getConnection(dbUrl, user, pwd)
case _ => DriverManager.getConnection(dbUrl)
}
Full(dm)
} catch {
case e: Exception => e.printStackTrace; Empty
}
def newConnection(name: ConnectionIdentifier): Box[Connection] =
synchronized {
pool match {
case Nil if poolSize < maxPoolSize =>
val ret = createOne
poolSize = poolSize + 1
ret.foreach(c => pool = c :: pool)
ret
case Nil => wait(1000L); newConnection(name)
case x :: xs => try {
x.setAutoCommit(false)
Full(x)
} catch {
case e => try {
pool = xs
poolSize = poolSize - 1
x.close
newConnection(name)
} catch {
case e => newConnection(name)
}
}
}
}
def releaseConnection(conn: Connection): Unit = synchronized {
pool = conn :: pool
notify
}
}
Any ideas?