Hello
This topic is very often met on this forum but there are no
suitable answers for the problem I have. I am creating
a Jsf application and I have setup a connection pool using
the MySql jar. I want to supply the jar with the war and I keep
it in WEB-INF/lib directory but I still get ClassNotFoundException.
I am running this on a Debian machine with Sun JVM 1.5,
Tomcat 5.0, Mysql 4.1, Connector/J - nightly build from
20060403 (since the stable version has bugs with Charset).
Here are the confings. If I missed some of them, pleaste tell
me.
War task in build.xml
<target name="war" depends="build">
<mkdir dir="${build.dir}"/>
<war
basedir="${webroot.dir}"
warfile="${build.dir}/${project.distname}.war"
webxml="${webinf.dir}/web.xml">
<metainf dir="${meta.dir}">
<include name="context.xml"/>
</metainf>
<exclude name="WEB-INF/${build.dir}/**"/>
<exclude name="WEB-INF/src/**"/>
<exclude name="WEB-INF/web.xml"/>
</war>
</target>
context.xml
<Context path="/jsfblog" docBase="jsfblog.war" reloadable="false" crossContext="true" useNaming="true">
<Resource name="jdbc/jsfblog" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/jsfblog">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost/jsfblog</value>
</parameter>
<parameter>
<name>driverClassName</name><value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>username</name>
<value>blog</value>
</parameter>
<parameter>
<name>password</name>
<value>blog</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>3000</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>100</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>10</value>
</parameter>
</ResourceParams>
</Context>
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="connection.datasource">java:comp/env/jdbc/jsfblog</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="show_sql">true</property>
<mapping resource="......"/>
</session-factory>
</hibernate-configuration>
web.xml
I am not sure if I really need this.
<web-app>
<!-- Connection pool configuration -->
<resource-ref>
<description>JSF Blog Database</description>
<res-ref-name>jdbc/jsfblog</res-ref-name>
<res-ref-type>javax.sql.DataSource</res-ref-type>
<res-auth>Container</res-auth>
</resource-ref>
<!-- jsf and facelets declarations -->
jsfblog.policy
Not all the rules apply at the same time. I also tried to
setup the mysql jar in ${catalina.home}/common/lib
directory and it was loaded but I need to make it work
in WEB-INF/lib location.
grant
{
permission java.io.FilePermission "${catalina.home}/webapps/jsfblog/WEB-INF/lib/mysql-connector-java-3.1.12-bin.jar", "read";
permission java.io.FilePermission "${catalina.home}/webapps/jsfblog/WEB-INF/lib/mysql-connector-java-3.1-nightly-20060403-bin.jar", "read";
permission java.net.SocketPermission "localhost:3306", "connect,resolve";
};
grant codeBase "jar:file:${catalina.home}/webapps/jsfblog/WEB-INF/lib/hibernate3.jar!/-" {
permission java.lang.RuntimePermission "accessDeclaredMembers";
permission java.util.PropertyPermission "*", "read,write";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
grant codeBase "jar:file:${catalina.home}/webapps/jsfblog/WEB-INF/lib/mysql-connector-java-3.1-nightly-20060403-bin.jar!/-"
{
permission java.net.SocketPermission "localhost:3306", "connect,resolve";
permission java.lang.RuntimePermission "accessDeclaredMembers";
permission java.util.PropertyPermission "*", "read,write";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
Project layout
.
|-- build
| `-- jsfblog.war
|-- build.xml
|-- conf
| `-- 99jsfblog.policy
|-- deploy
| `-- jsfblog.war
|-- doc
| |-- WEB-INF
| | |-- classes
| | | |-- beans
| | | | `-- CategoryBean.class
| | | |-- blog
| | | | |-- Category.class
| | | | |-- Category.hbm.xml
| | | | |-- Comment.class
| | | | |-- Comment.hbm.xml
| | | | |-- Post.class
| | | | `-- Post.hbm.xml
| | | |-- hibernate.cfg.xml
| | | |-- log4j.properties
| | | `-- util
| | | |-- HibernateSessionFactory.class
| | | |-- HibernateUtil.class
| | | `-- Service.class
| | |-- faces-config.xml
| | |-- lib
| | | |-- antlr-2.7.5.jar
| | | |-- asm-attrs.jar
| | | |-- asm.jar
| | | |-- cglib-2.1.3.jar
| | | |-- common-annotations.jar
| | | |-- commons-beanutils.jar
| | | |-- commons-collections-2.1.1.jar
| | | |-- commons-digester.jar
| | | |-- commons-lang.jar
| | | |-- commons-logging-1.0.4.jar
| | | |-- commons-validator.jar
| | | |-- dom4j-1.6.1.jar
| | | |-- el-api.jar
| | | |-- el-ri.jar
| | | |-- hibernate3.jar
| | | |-- jsf-api.jar
| | | |-- jsf-facelets.jar
| | | |-- jsf-impl.jar
| | | |-- jsf-tlds.jar
| | | |-- jstl.jar
| | | |-- jta.jar
| | | |-- log4j-1.2.11.jar
| | | |-- mysql-connector-java-3.1-nightly-20060403-bin.jar
| | | `-- standard.jar
| | `-- web.xml
| |-- admin
| | |-- admintemplate.xhtml
| | |-- category.xhtml
| | |-- index.xhtml
| | `-- skeleton.xhtml
| |-- index.jsp
| `-- layout.css
|-- lib
| `-- servlet.jar
|-- meta
| `-- context.xml
`-- src
|-- beans
| `-- CategoryBean.java
|-- blog
| |-- Category.hbm.xml
| |-- Category.java
| |-- Comment.hbm.xml
| |-- Comment.java
| |-- Post.hbm.xml
| `-- Post.java
|-- hibernate.cfg.xml
|-- log4j.properties
`-- util
`-- HibernateUtil.java
And, finally, the error message:
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClassLoader.java:854)
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClassLoader.java:721)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:760)
... 60 more
I don't really understand how I can setup the CLASSPATH in this
context. So there should be something else. Does anyone have an
idea?
Thanks.
Igor