End-to-end setting up TomEE on a linux server


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!