UniTime Installation
For simplified step by step installation notes, see
Prerequisites
Java Development Kit
If you do not have Java SE (Standard Edition) Development Kit 8.0 or later already installed, you will need to download and install it from Java SE Downloads first.
OpenJDK 8 and 11 (using HotSpot JVM) are being used in the development and/or testing.
If you are using Java 16 or newer, you will need to set the --illegal-access=permit java option (e.g., using the JAVA_OPTS variable) as some of the UniTime dependencies do not support strong encapsulation yet.
Apache Tomcat
Download Apache Tomcat.
Versions 8.5 and 9.0 are used for development and/or testing.
Apache Tomcat 10.0 is not supported in UniTime 4.5 or older due to the change from Java EE to Jakarta EE. A special Tomcat 10 compatible build of UniTime is needed.
Apache Tomcat 7.0 or earlier are not supported in UniTime 4.6 or later (Servlet 3.1 or later is needed)
Install Apache Tomcat
For more information about Tomcat setup see this Tomcat 8.5 Setup User Guide or Tomcat 9.0 Setup User Guide
You might want to set up SSL (HTTPS) access to your tomcat. See SSL Configuration HOW-TO for more details.
MySQL
Download MySQL from MySQL Downloads
MySQL version 5.7 and Oracle version 19c are currently being used in development and testing.
MySQL 8.0 is supported as well, though you may need to add serverTimezone parameter in the connection string (see MySQL Time Zone Support for more details).
MariaDB is currently not supported.
Install MySQL
See MySQL 5.7 Reference Manual for more details about installation
Install MySQL JDBC driver
The driver can be downloaded from the Download Connector/J page. Please make sure you use the same version as your MySQL database.
Unzip the downloaded driver if needed and place the mysql-connector-java-5.7.x.jar under the Tomcat/lib folder.
Installation
Download the latest UniTime 4.5 distribution from UniTime Downloads
All distributions are platform-independent, distributed in either .zip or .tar.gz format
Alternatively, you can download the most recent nightly build from UniTime Nightly Builds
Unzip the archive
tar -xvzf unitime-4.6_bld77.tar.gz
Install timetable database
MySQL installation scripts are located in doc/mysql folder of the distribution
File schema.sql contains the database schema, file woebegon-data.sql contains test data (Woebegon College Test Suite, see Online Demo for more details).
If you want to change the default user name/password, edit the file schema.sql first. The user is created at the very beginning of the script.
Timetable database can be created and populated using the mysql command-line tool
After running "schema.sql", you need to populate the database either using "woebegon-data.sql" or "blank-data.sql" file
When woebegon-data are used, you will be able to login into the application using the same credentials as described on our online demo page
When blank-data are used, there is only administrator account created. Both username and password are admin.
mysql -uroot -p -f <schema.sql
mysql -uroot -p <woebegon-data.sql
Deploy UniTime application
Copy web/UniTime.war to Tomcat/webapps, where Tomcat is the folder where Tomcat is installed.
On unix based systems (including Mac OS X), java virtual machine that is running tomcat needs to be switched to headless mode. You can do that using JAVA_OPTS environment variable prior to starting tomcat:
export JAVA_OPTS="${JAVA_OPTS} -Djava.awt.headless=true"
Also, you might need to give Tomcat more memory to work with by changing the upper limit on the memory that it can allocate (especially if you are planning not to run any remote solver servers -- see below; default is 64MB). You can do that using JAVA_OPTS environment variable as well:
export JAVA_OPTS="${JAVA_OPTS} -Xmx2048m"
Start tomcat
If everything goes well, you should be able to see UniTime application at http://localhost:8080/UniTime or https://localhost:8443/UniTime when SSL connector is enabled.
If not, please check the tomcat log for any potential problems -- it is located at Tomcat/logs/catalina.out
Please refer to for a solution Installation FAQ and/or write us an email to support@unitime.org
Tip: If you have installed Tomcat on a Linux-based machine from a package (e.g., by running apt-get install tomcat8), you will need to make sure that there is a data folder available within the tomcat directory and that Tomcat has enough permissions to write files in there. This can be accomplished with something like:
mkdir /var/lib/tomcat8/data
chown tomcat8 /var/lib/tomcat8/data
Tomcat configuration (including the JAVA_OPTS variable) is located in the /etc/default/tomcat8 file in this case.
Tip: If you are using Tomcat 9 on Ubuntu/Debian, you may need to create a file /etc/systemd/system/tomcat9.service.d/override.conf containing the following lines:
[Service] ReadWritePaths=/var/lib/tomcat9/data
This is due to the new sandboxing feature. More details are available at https://salsa.debian.org/java-team/tomcat9/blob/master/debian/README.Debian
Upgrade
To upgrade an existing UniTime installation, only the new UniTime.war file should be placed in the Tomcat/webapps folder instead of the existing one. All the necessary changes to the database are done automatically during the first deployment. The safest way to do so is as follows:
If you are using remove solver servers, the appropriate JARs need to be updated as well.
If upgrading from UniTime 3.3
If you are using LDAP for authentication, some configuration properties will need to be changed. See LDAP Authentication / Lookup page for details.
If upgrading from UniTime 3.4
If you are using remote solver servers and/or multiple tomcats, see below how to setup a cluster.
If upgrading from UniTime 3.5
If you are using MySQL, place the MySQL JDBC driver in the Tomcat/lib folder (the driver can be downloaded from the Download Connector/J page, see above).
See UniTime 4.6 release notes for other changes.
Customization
Custom Properties
There are a lot of properties that are defined in file application.properties that is located in timetable.jar that is located in UniTime.war at WEB-INF/lib. These properties can be changed in one of the following ways:
By providing custom property file, this file should be named custom.properties and located in UniTime.war at WEB-INF/classes.
Alternatively, custom property file can be located somewhere else, with system property tmtbl.custom.properties pointing to it.
By adding and/or changing the appropriate properties directly in the UniTime application -- see Administration / Defaults / Configuration menu item when logged in as administrator.
By adding these properties in Tomcat/conf/catalina.properties
By providing JVM that is running tomcat with the appropriate system properties, for instance:
export JAVA_OPTS="${JAVA_OPTS} -Dtmtbl.title=Timetabling Demo"
export JAVA_OPTS="${JAVA_OPTS} -Dtmtbl.custom.properties=/etc/default/unitime.properties
Tip: Name the custom properties file Tomcat/conf/unitime.properties and put all the properties you need in there. For UniTime to use the file, add the following line to Tomcat/conf/catalina.properties
tmtbl.custom.properties=${catalina.base}/conf/unitime.properties
If the same property is defined on multiple places, the first one from the following order will be taken:
UniTime Configuration (Administration / Defaults / Configuration menu item)
System property (-Dproperty=value, or defined in Tomcat/conf/catalina.properties)
File custom.properties (UniTime.war/WEB-INF/classes/custom.properties or as defined by tmtbl.custom.properties system property)
File application.properties (UniTime.war/WEB-INF/lib/timetable.jar/application.properties)
Database Connection
The database connection can be changed using custom properties. However, please note that these properties cannot be defined using the UniTime application (Administration / Defaults / Configuration menu item) since the database connection needs to be configured before the database can be accessed. For instance, custom.properties file can contain:
# MySQL Configuration Example
connection.url=jdbc:mysql://localhost:3306/timetable?serverTimezone=Europe/Prague
connection.username=timetable
connection.password=unitime
connection.driver_class=com.mysql.jdbc.Driver
dialect=org.hibernate.dialect.MySQLInnoDBDialect
tmtbl.uniqueid.generator=org.hibernate.id.TableHiLoGenerator
default_schema=timetable
See LDAP Authentication / Lookup page for notes about LDAP integration.
See Customizations page for notes about custom styling (branding) of the UniTime application.
Remote Solver Server(s)
By default, all timetabling problems are solved within the application (using the same Java Virtual Machine), however, especially for bigger institutions, it might be desired to solve the timetabling problems by one or more separate solver servers.
All the necessary libraries are in the solver folder of the distribution except the JDBC driver. For MySQL download mysql-connector-java-5.1.36.jar , for Oracle download ojdbc7.jar and name it ojdbc7-12.1.0.2.jar.
Place the JDBC driver in the solver directory (same location as the timetable.jar), for instance:
curl https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.46/mysql-connector-java-5.1.46.jar --output solver/mysql-connector-java-5.1.36.jar
To run a remote solver, do:
java -Xmx2g -Dtmtbl.custom.properties=custom.properties -jar solver/timetable.jar
File custom.properties should contain all the custom parameters needed for the starting up the server (e.g., database connection properties, if different from the defaults). It is usually the same as the one used on the Tomcat, except the jgroups.tcp.address property (see below). The load is automatically and seamlessly balanced between the remote solvers. The remote solver server also automatically reconnects itself when the web server is restarted. When the remote solver is shut down, all active timetabling instances are backed up and restored when the solver server is started again. The following properties need to be set in the custom.properties file. Please note that all these properties need to be set on the Tomcat side as well.
jgroups.tcp.address=127.0.0.1
IP address of the machine that is using this configuration file. This property should be different on each machine, the ramining properties are usually the same for all the UniTime instances (Tomcats as well as remote solver servers). If the property is set to 127.0.0.1 or localhost, the server will not be able to accept remote connections -- use only if all the instances are running on the same machine!
unitime.solver.cluster=true
This property enables the Solver cluster. This cluster is used for RPCs between the Tomcat(s) and the remote solver server(s). Communication between UniTime instances is done using JGroups.
unitime.solver.port=7800
Default communication port for the Solver cluster. If the given port is taken (e.g., there are running multiple remote solver server(s) on the same machine), the next one available will be used instead.
unitime.solver.initial_hosts=127.0.0.1[7800]
By default, TCP ping discovery is used to form a cluster. The above parameter defines a comma separated list of machines (and their communication ports) on which a UniTime instance may be running. It does not necessary need to have all the possible IP addresses, usually it is set to the IP addresses of the Tomcat server(s) running UniTime.
unitime.solver.jgroups.config=solver-jgroups-tcp.xml
An alternative JGroups configuration file can be provided with this property. The default configuration file is available here.
unitime.enrollment.server.replicated=false
This property enables replication of online student scheduling servers. If enabled, there is an additional Enrollment cluster is formed and the same instance (academic session) of an online student scheduling server can be spawn by each of the servers (with the data replicated among them). By default, one of them will be elected as master and handle all the updates, while the others will assist in no-updating queries (e.g., computation of a student's schedule or suggestions) and step in in case of a failover. It is also possible to direct particular academic sessions to a particular UniTime instances (Tomcats or remote solver servers) using the unitime.enrollment.term, unitime.enrollment.year, unitime.enrollment.campus properties (containing a regular expression which has to match against academic session term, year and initiative respectively).
unitime.enrollment.port=7866
If online student scheduling server replication is enabled, additional Enrollment cluster is formed. It is used to replicate data between online student scheduling instances. This is the communication port for the Enrollment cluster.
unitime.enrollment.initial_hosts=127.0.0.1[7866]
List of initial hosts for the Enrollment cluster.
unitime.enrollment.jgroups.config=sectioning-jgroups-tcp.xml
An alternative JGroups configuration file can be provided with this property. The default configuration file is available here.
The remote solvers can be managed in the UniTime application, see Administration > Solver > Manage Solvers menu item when logged in as an administrator.
Tip: If you use a different version of the JDBC driver, it needs to be added to the classpath. For example:
java -Xmx2g -Dtmtbl.custom.properties=custom.properties -cp solver/timetable.jar:solver/mysql-connector-java-5.1.46.jar org.unitime.timetable.solver.jgroups.SolverServerImplementation
Having Multiple Tomcats (Clustering)
With UniTime 4.0, it is possible to run multiple instances of UniTime on a cluster of Tomcats and/or remote solver servers. Besides of the Solver cluster and Enrollment cluster, it is also possible to form a Hibernate cluster that is used to replicate Hibernate L2 cache. The following properties can be used to configure the Hibernate cluster.
unitime.hibernate.cluster=true
This property enables the Hibernate cluster. This cluster is used for replication of Hibernate second level cache between multiple UniTime instances.
unitime.hibernate.port=7833
Default communication port for the Hibernate cluster. If the given port is taken (e.g., there are running multiple remote solver server(s) on the same machine), the next one available will be used instead.
unitime.hibernate.initial_hosts=127.0.0.1[7833]
By default, TCP ping discovery is used to form a cluster. The above parameter defines a comma separated list of machines (and their communication ports) on which a UniTime instance may be running. It does not necessary need to have all the possible IP addresses, usually it is set to the IP addresses of the Tomcat server(s) running UniTime.
unitime.hibernate.jgroups.config=hibernate-jgroups-tcp.xml
An alternative JGroups configuration file can be provided with this property. The default configuration file is available here.
Please note that Hibernate cluster is only needed when there are two or more Tomcats running UniTime. Remote solver servers have the L2 cache disabled and hence no need to connect to the Hibernate cluster.
Using Oracle Database
Here are some notes about using Oracle Database
The following custom properties need to be set (connection URL, username, password may vary)
# Oracle Configuration Example
connection.url=jdbc:oracle:thin:@localhost:1521:xe
connection.username=timetable
connection.password=unitime
connection.driver_class=oracle.jdbc.driver.OracleDriver
dialect=org.hibernate.dialect.Oracle10gDialect
tmtbl.uniqueid.generator=org.hibernate.id.SequenceGenerator
If the schema is different to timetable, the default_schema property needs to be changed as well
default_schema=timetable
File ojdbc7.jar (or later) needs to be copied either to Tomcat/lib or to Tomcat/webapps/UniTime/WEB-INF/lib. This file can be downloaded, e.g., from Oracle JDBC Drivers
Oracle installation scripts are located in doc/oracle folder of the distribution
Alternatively, the database can be imported using imp tool and the woebegon.dat from the GitHub.
imp timetable/###### file=woebegon.dat full=y
User timetable needs to be created first, e.g., using sqlplus
sqlplus system
create user timetable identified by ######; grant dba to timetable; exit
Using PostgreSQL
Here are some notes about using PostgreSQL, for more details please see the Migrating to PostgreSQL document.
Install PostgreSQL 12.0 or later from https://www.postgresql.org/download (using the default port 5432, and a custom password)
Create timetable user and timetable database, using the same name and credentials as the default UniTime database:
createuser --interactive --pwprompt -U postgres
Enter name of role to add: timetable
Enter password for new role: unitime
Enter it again: unitime
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
Password: <password provided during install>
createdb timetable -U timetable -O timetable
Password: unitime
Populate the timetable database, using this timetable.sql file (Documentation/Database/PostgreSQL/timetable.sql in https://github.com/UniTime/unitime)
psql -U timetable <timetable.sql
Download JDBC Driver from https://jdbc.postgresql.org/download.html and place it to Tomcat/lib (e.g., postgresql-42.2.8.jar)
Change UniTime connection properties. The following custom properties need to be set (connection URL, username, password may vary)
# PostgreSQL Configuration Example
connection.url=jdbc:postgresql://localhost:5432/timetable
connection.driver_class=org.postgresql.Driver
dialect=org.hibernate.dialect.PostgreSQL9Dialect
connection.username=timetable
connection.password=unitime
default_schema=timetable
hibernate.dbcp.validationQuery=select 1
hibernate.globally_quoted_identifiers=true
Start UniTime, check the logs for any errors.