Apache Jackrabbit : JackrabbitOnTomcat6

Jackrabbit On Tomcat 6

  • This applies to Jackrabbit 1.6, Tomcat 6 and Mysql 5
  • My configuration is Ubuntu Server 8.10 (Intrepid) using stock tomcat6 install from ubuntu repository. Can easily tweak this for vanilla tomcat6 install on any distro.


Ubuntu setup

apt-get install mysql-server sun-java6-jdk tomcat6 tomcat6-admin libmysql-java
ln -s /usr/share/java/mysql.jar /usr/share/tomcat6/lib/mysql.jar

Note: I am using the http://ourdelta.org version of MySQL - will work with any version though


Make sure jcr-2.0.jar is in /usr/share/tomcat6/lib (don't link it to /var/lib/tomcat6/lib as well as the other tomcat libraries - this seemed to cause problems)

cd /usr/share/tomcat6/lib
wget http://mirrors.ibiblio.org/pub/mirrors/maven2/javax/jcr/jcr/2.0/jcr-2.0.jar

Jackrabbit Installation

Copy the jackrabbit war to webapps directory

wget http://www.apache.org/dist/jackrabbit/1.6.4/jackrabbit-webapp-1.6.4.war
cp jackrabbit-webapp-1.6.4.war /var/lib/tomcat6/webapps/jackrabbit.war

Note: please use mirror

You can now go to http://localhost:8080/jackrabbit and you should see the welcome page. Create a standard default repository (mine is called "jackrabbit") When creating a default repository, make sure the directory is writeable for Tomcat. Otherwise you will get messages like 'content repository already exists', however, it doesn't. E.g. the default repository would be created in /var/lib/tomcat, so change the owner to user tomcat

chown -R tomcat6:tomcat6 /var/lib/tomcat6

Customisation for Mysql

Create Mysql database (mine is called jackrabbit here with standard user/password):

mysqladmin -u root create jackrabbit
mysql -u root jackrabbit -e "GRANT ALL ON jackrabbit.* TO 'jackrabbit'@'localhost' IDENTIFIED BY 'jackrabbit'"

Ok, this is the fiddly part. Edit /var/lib/tomcat6/temp/jackrabbit and do either 1. or 1. & 2.

1. PersistenceManager

This stores all the repository in mysql - all the file config is still on the file system. Find all the occurances of something like this:

<PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.DerbyPersistenceManager">
  <param name="url" value="jdbc:derby:${wsp.home}/db;create=true"/>
  <param name="schemaObjectPrefix" value="${wsp.name}_"/>

and change them to

<PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.MySqlPersistenceManager">
  <param name="url" value="jdbc:mysql://localhost:3306/jackrabbit"/>
  <param name="user" value="jackrabbit" />
  <param name="password" value="jackrabbit" />
  <param name="schema" value="mysql"/>
  <param name="schemaObjectPrefix" value="pm_someuniqueprefix_"/>

2. DbFileSystem

This part is optional, but if you do this everything is stored in the mysql database. Find all the occurances of something like this:

<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
  <param name="path" value="${rep.home}/repository"/>

and replace with this:

<FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
  <param name="driver" value="com.mysql.jdbc.Driver"/>
  <param name="url" value="jdbc:mysql://localhost:3306/jackrabbit"/>
  <param name="user" value="jackrabbit"/>
  <param name="password" value="jackrabbit"/>
  <param name="schema" value="mysql"/>
  <param name="schemaObjectPrefix" value="fs_someuniqueprefix_"/>

Make sure you change the part someuniqueprefix to something unique for the type of repository configuration item you are modifying (ie. workspace, versioning etc)

Cleanup & Test

Now delete the version, workspaces and repository directories and redeploy the app (or restart tomcat if you like)

rm -rf /var/lib/tomcat6/temp/jackrabbit/version /var/lib/tomcat6/temp/jackrabbit/workspaces /var/lib/tomcat6/temp/jackrabbit/repository
/etc/init.d/tomcat6 restart

If everything worked, if you issue the command

mysql -u jackrabbit -pjackrabbit jackrabbit -e "show tables"

You should get something like this:

| Tables_in_jackrabbit |
| PM_WS_BINVAL         | 
| PM_WS_BUNDLE         | 
| PM_WS_NAMES          | 
| PM_WS_REFS           | 

and should be able to access the repository in exactly the same way as if it was out of the box (file/derby) based.

Common Problems

org.apache.jackrabbit.rmi.client.RemoteRepositoryException - Connection refused to host: localhost; nested exception is: java.net.ConnectException: Connection refused

- Make sure mysql.jar is in right place.