How do I add jar files to my app?

20 views
Skip to first unread message

Goldfish

unread,
Aug 17, 2009, 7:24:34 AM8/17/09
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?

marius d.

unread,
Aug 17, 2009, 10:04:37 AM8/17/09
to Lift
The JDBC driver should not be in the applications class-path (WEB-INF/
lib) but in container's classpath. Say jetty's lib folder.

Br's,
Marius

Timothy Perrett

unread,
Aug 17, 2009, 10:38:47 AM8/17/09
to lif...@googlegroups.com

You can specify this in maven, but make sure you set the scope:

<scope>provided</scope>

Cheers, Tim
Reply all
Reply to author
Forward
0 new messages