In this post I describe an end-to-end setup for TomEE+ and my application on a vanilla linux (Debian) server.
This is just one of the many possible configurations. Be advised that changes done to system(s) or configuration(s) might be useful in some cases while in other cases not. Although I have put an effort in explaining why I perform these or those changes, errors and omissions are likely. That’s why I cannot take any responsibility for the loss of data or damage to your systems. Always use your own brain and question stuff you read here at all times.
One more disclaimer – information in this post is mainly credited by other people in numerous publications in internet. I just aggregated, structured and adapted it to my needs. If some of you recognize own material (or that of your friend) please let me know and I will gladly add the credit. I am not doing this right away since this article is a result of days and days of research and I just can’t remember the sources I got this information from.
Enjoy!
Preconditions
- 64bit Debian Server
- LAMP (Linux Apache MySql PHP)
1. Install Java JDK 1.7
I am installing oracle jdk and yes it has to be jdk (as in no – jre is NOT sufficient). OpenJDK had some issue (with either TomEE or, more likely, my own web application) I unfortunately cannot remember.
- get Java 1.7 here: http://www.oracle.com/technetwork/java/javase/downloads/index.html
- move Java to the “right” location
mkdir /usr/lib64/jvm mv [java download dir] /usr/lib64/jvm/
- set symlink (so that later java updates get propagated)
ln -s /usr/lib64/jvm/jre1.7.0_09/ /usr/lib64/jvm/java-7-oracle
- activate java
update-alternatives --install "/usr/bin/java" "java" "/usr/lib64/jvm/jdk-7-oracle/bin/java" 1 update-alternatives --install "/usr/bin/jar" "jar" "/usr/lib64/jvm/jdk-7-oracle/bin/jar" 1
- open profile file, set JAVA_HOME, save it and exit
nano /etc/profile
JAVA_HOME="/usr/lib64/jvm/java-7-oracle" export JAVA_HOME
- refresh environment
source /etc/profile
2. Configure apache2
So why do we need apache2 at all? I had two reasons, the reason one being this article on stackoverflow and the sconed reason being apache2 already pre-installed by my server provider as part of LAMP.
- get mod_jk
apt-get install libapache2-mod-jk
- change two lines in /etc/libapache2-mod-jk/workers.properties
workers.tomcat_home=/usr/local/tomee workers.java_home=/usr/lib64/jvm/java-7-oracle
- create and fill /etc/apache2/conf.d/mod-jk.conf
JkWorkersFile /etc/libapache2-mod-jk/workers.properties JkLogFile /var/log/apache2/mod_jk.log JkLogLevel error JkShmFile /var/log/apache2/jk-runtime-status
- create your virtual Host in /etc/apache2/sites-available/ic.remasoft.com
JkMount /* ajp13_worker ServerName ic.remasoft.com DocumentRoot /usr/local/tomee/webapps ErrorLog /usr/local/tomee/logs/error.log CustomLog /usr/local/tomee/logs/access.log common Options -Indexes - activate vHost and restart apache2
a2ensite ic.remasoft.com /etc/init.d/apache2 restart
3. Install TomEE
If at this point you still don’t know what TomEE is please leave a comment explaining why the heck did you read this article up to this point! 🙂 Seriously tho, here’s good starting point.
- get TomEE Plus here: http://tomee.apache.org/downloads.html
- move TomEE to the “right” location
mkdir /usr/local/tomee mv [TomEE download dir] /usr/local/tomee
- add tomee user
groupadd tomee useradd -g tomee -d /usr/local/tomee tomee usermod -G www-data tomee chmod +x /usr/local/tomee/bin/*.sh
- create init file for tomee
nano /etc/init.d/tomee
- add following text to tomee’s init file and save it
#!/bin/bash ### BEGIN INIT INFO # Provides: tomee # Required-Start: $local_fs $remote_fs $network # Required-Stop: $local_fs $remote_fs $network # Should-Start: $named # Should-Stop: $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: TomEE_Plus_ic # Description: start TomEE with iC ### END INIT INFO #TomEE auto-start #description: Auto-starts TomEE #processname: tomee #pidfile: /var/run/tomee.pid export JAVA_HOME=/usr/lib64/jvm/java-7-oracle case $1 in start) /bin/su tomee -c /usr/local/tomee/bin/startup.sh ;; stop) /bin/su tomee -c /usr/local/tomee/bin/shutdown.sh ;; restart) /bin/su tomee -c /usr/local/tomee/bin/shutdown.sh /bin/su tomee -c /usr/local/tomee/bin/startup.sh ;; esac exit 0
- set rights for the init file
chmod 755 /etc/init.d/tomee
- set autostart
update-rc.d tomcat defaults
4. Configure TomEE
Now TomEE runs out-of-the-box, so this part is required only if you have explicit configuration needs related to your specific application. I have an application that uses MySql and have couple of special needs regarding logging and application deployment.
- configure lib dir of TomEE
- get mysql connector here : http://www.mysql.com/downloads/connector/j/mysql-connector-java-x.x.xx-bin.jar and copy it to tomee’s lib dir
- get log4j-1.2.17.jar and copy it to tomee’s lib dir
- get slf4j-log4j12-1.7.1.jar and copy it tom tomee’s lib dir
- remove slf4j-jdk14-1.7.2.jar from lib dir to avoid slf4j init conflicts
mv mysql-connector-java-5.1.22-bin.jar /usr/local/tomee/lib mv log4j-1.2.17.jar /usr/local/tomee/lib mv slf4j-log4j12-1.7.1.jar /usr/local/tomee/lib rm /usr/local/tomee/lib/slf4j-jdk14-1.7.2.jar
- add log4j config directly in lib folder and add configuration
nano /usr/local/tomee/lib/log4j.properties
log4j.debug=true log4j.rootLogger=INFO, CATALINA, CONSOLE # Define all the appenders log4j.appender.CATALINA=org.apache.log4j.FileAppender log4j.appender.CATALINA.file=${catalina.base}/logs/catalina.log log4j.appender.CATALINA.encoding=UTF-8 log4j.appender.CATALINA.layout=org.apache.log4j.PatternLayout log4j.appender.CATALINA.layout.conversionPattern = %d [%t] %-5p %c - %m%n log4j.appender.CATALINA.append=true log4j.appender.LOCALHOST=org.apache.log4j.FileAppender log4j.appender.LOCALHOST.file=${catalina.base}/logs/localhost.log log4j.appender.LOCALHOST.encoding=UTF-8 log4j.appender.LOCALHOST.layout=org.apache.log4j.PatternLayout log4j.appender.LOCALHOST.layout.conversionPattern = %d [%t] %-5p %c - %m%n log4j.appender.LOCALHOST.append=true log4j.appender.MANAGER=org.apache.log4j.FileAppender log4j.appender.MANAGER.file=${catalina.base}/logs/manager.log log4j.appender.MANAGER.encoding=UTF-8 log4j.appender.MANAGER.layout=org.apache.log4j.PatternLayout log4j.appender.MANAGER.layout.conversionPattern = %d [%t] %-5p %c - %m%n log4j.appender.MANAGER.append=true log4j.appender.HOST-MANAGER=org.apache.log4j.FileAppender log4j.appender.HOST-MANAGER.file=${catalina.base}/logs/host-manager.log log4j.appender.HOST-MANAGER.encoding=UTF-8 log4j.appender.HOST-MANAGER.layout=org.apache.log4j.PatternLayout log4j.appender.HOST-MANAGER.layout.conversionPattern = %d [%t] %-5p %c - %m%n log4j.appender.HOST-MANAGER.append=true log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.encoding=UTF-8 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.conversionPattern=%d [%t] %-5p %c - %m%n # Configure which loggers log to which appenders log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=INFO, LOCALHOST log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager]=\ INFO, MANAGER log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager]=\ INFO, HOST-MANAGER
- remove standard log
mv /usr/local/tomee/conf/logging.properties /usr/local/tomee/conf/logging.properties.jul
- adjust Engine and Host tag in /usr/local/tomee/conf/server.xml to
... - replace all Resource tags in /usr/local/tomee/conf/tomee.xml with this
JdbcDriver com.mysql.jdbc.Driver JdbcUrl jdbc:mysql://localhost:3306/ic?autoReconnect=true UserName root Password JtaManaged true JdbcDriver com.mysql.jdbc.Driver JdbcUrl jdbc:mysql://localhost:3306/ic?autoReconnect=true UserName root Password JtaManaged false - change welcome-file-list in /usr/local/tomee/conf/web.xml to
index.xhtml index.html index.htm index.jsp - adjust properties in /usr/local/tomee/conf/system.properties
tomee.jaxws.subcontext = / openejb.deploymentId.format = {appId}/{ejbName} openejb.wsAddress.format = /{wsdlService}
- remove the default ROOT webapp
rm -R /usr/local/tomee/webapps/ROOT
5. Install iC
- get iC *.war files and move them to TomEEs webapps dir
mv ROOT.war /usr/local/tomee/webapps mv some-services.war /usr/local/tomee/webapps
6. Configure MySql
- create iC database
mysql -u root -p mysql> create database ic character set utf8; mysql> grant all privileges on ic.* to root@localhost;
- add ic tables
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; CREATE SCHEMA IF NOT EXISTS `ic` DEFAULT CHARACTER SET utf8 ; USE `ic` ; -- ----------------------------------------------------- -- Table `ic`.`Permission` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `ic`.`Permission` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `permission` VARCHAR(128) NOT NULL , PRIMARY KEY (`id`) , UNIQUE INDEX `permission_UNIQUE` (`permission` ASC) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; -- ----------------------------------------------------- -- Table `ic`.`Role` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `ic`.`Role` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `name` VARCHAR(45) NOT NULL , `description` TEXT NULL DEFAULT NULL , PRIMARY KEY (`id`) , UNIQUE INDEX `name_UNIQUE` (`name` ASC) ) ENGINE = InnoDB AUTO_INCREMENT = 2 DEFAULT CHARACTER SET = utf8; -- ----------------------------------------------------- -- Table `ic`.`Role_Permission` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `ic`.`Role_Permission` ( `role_id` INT(11) NOT NULL , `permission_id` INT(11) NOT NULL , PRIMARY KEY (`role_id`, `permission_id`) , INDEX `fk_role_permission_1` (`role_id` ASC) , INDEX `fk_permission_role_1` (`permission_id` ASC) , CONSTRAINT `fk_permission_role_1` FOREIGN KEY (`permission_id` ) REFERENCES `ic`.`Permission` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_role_permission_1` FOREIGN KEY (`role_id` ) REFERENCES `ic`.`Role` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; -- ----------------------------------------------------- -- Table `ic`.`User` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `ic`.`User` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `username` VARCHAR(20) NOT NULL , `password` VARCHAR(256) NOT NULL , `salt` TINYBLOB NULL DEFAULT NULL , `version` INT(11) NULL DEFAULT NULL , PRIMARY KEY (`id`) , UNIQUE INDEX `username_UNIQUE` (`username` ASC) , INDEX `version_NONUNIQUE` (`version` ASC) ) ENGINE = InnoDB AUTO_INCREMENT = 2 DEFAULT CHARACTER SET = utf8; -- ----------------------------------------------------- -- Table `ic`.`User_Role` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `ic`.`User_Role` ( `role_id` INT(11) NOT NULL , `user_id` INT(11) NOT NULL , PRIMARY KEY (`role_id`, `user_id`) , INDEX `fk_role_user_1` (`role_id` ASC) , INDEX `fk_user_role_1` (`user_id` ASC) , CONSTRAINT `fk_role_user_1` FOREIGN KEY (`role_id` ) REFERENCES `ic`.`Role` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_user_role_1` FOREIGN KEY (`user_id` ) REFERENCES `ic`.`User` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; }}}
- add data
INSERT INTO `Role` (`id`,`name`,`description`) VALUES (1,'admin',NULL); INSERT INTO `User` (`id`,`username`,`password`,`salt`,`version`) VALUES (1,'ic','somepassword',NULL,1); INSERT INTO `User_Role` (`user_id`,`role_id`) VALUES (1,1);
7. Run
- set tomee as owner of tomee dir
chown tomee:tomee /usr/local/tomee -R
- execute as super user
/etc/init.d/tomee start
8. Test
Finally, call your application (I did it by calling http://ic.remasoft.com).
You have set up a TomEE instance on a linux system, congratulations!