Native Tomcat Launchers

Sometimes it is convinient to start Tomcat using a native launcher under Windows & Mac OS X

  • Clear distinction between other running Tomcat instances
  • Integration with desktop application launchers
  • Shipping a Tomcat-based product

In my particular use case I was creating native launchers for Apache JSPWiki (see https://jspwiki.apache.org)

Available Options

What options do you have in the open-source world

Mac OS X AppBundler

The following snippet

  • defines an a Ant task definition "bundleappp"
  • invokes the "bundleapp" tasks to create a native Mac OS X launcher
  • sets the executable flag of the underyling native launcher (just to make 100% sure the file is exetuable)
<target name="woas:mac-app-oracle-jdk" description="creates an Mac OS X application wrapper for Oracle JDK 1.7+">
    <taskdef 
        name="bundleapp" 
        classname="com.oracle.appbundler.AppBundlerTask"
        classpath="${basedir}/src/resources/appbundler/appbundler-1.0.jar" 
    />
    <bundleapp 
        outputdirectory="${jspwiki.woas.assembly.dir}"
        name="woas"
        displayname="Portable JSPWiki"
        identifier="org.apache.jspwiki.jspwiki-portable"
        icon="${basedir}/src/resources/macos/jspwiki.icns"
        shortversion="${jspwiki.woas.version}"
        applicationCategory="public.app-category.developer-tools"
        mainclassname="org.apache.catalina.startup.Bootstrap">
        <classpath file="${basedir}/target/unpack/tomcat/${jspwiki.tomcat.distribution}/bin/bootstrap.jar"/>
        <classpath file="${basedir}/target/unpack/tomcat/${jspwiki.tomcat.distribution}/bin/tomcat-juli.jar"/>
        <option value="-Xmx96m"/>
        <option value="-Duser.dir=$APP_ROOT/.."/>
        <option value="-Dcatalina.home=$APP_ROOT/.."/>
        <option value="-Dcatalina.base=$APP_ROOT/.."/>
        <option value="-Djava.io.tmpdir=$APP_ROOT/../temp"/>
    </bundleapp>
    <chmod file="${jspwiki.woas.assembly.dir}/woas.app/Contents/MacOS/JavaAppLauncher" perm="ugo+x"/>
</target>    

Some notes along the line

  • "APP_ROOT" is the directory of the Mac OS X launcher and will be expanded accordingly during run-time
  • The current working directory is undefined therefore all "important" properties must be provided
  • The two referenced JARs are effectively copied into the native launcher
  • No JRE is packaged since it assumed that the JRE is available on the target box
  • If you need to change the memory settings for an existing native app than you can edit the "Info.plist" directly
  • If the native app is starting at all you get no error message which is a bit annoying - as work-around you can launch at the command line to see the output, e.g "./woas.app/Contents/MacOS/JavaAppLauncher"

Windows Launch4J

  • Defines an a Ant task definition "launch4j"
  • Invokes the "launch4j" tasks to create a native Mac OS X launcher
<target name="woas:windows-app" description="creates an windows application wrapper">
    <taskdef 
      name="launch4j"
      classname="net.sf.launch4j.ant.Launch4jTask"
      classpath="${basedir}/src/resources/launch4j/launch4j-3.1.0-beta2.jar:${basedir}/src/resources/launch4j/xstream.jar" 
    />
    <launch4j>
      <config 
        headerType="console" 
        outfile="${jspwiki.woas.assembly.dir}/woas.exe" 
        errTitle="WikiOnAStick" 
        chdir="." 
        icon="${basedir}/src/resources/windows/jspwiki.ico"
        jar="${basedir}/src/resources/tomcat/tomcat-launcher-7.0.52.jar"
        >
        <singleInstance mutexName="org.apache.jspwiki.jspwiki-portable" />
        <jre minVersion="1.6.0" />
        <versionInfo
          fileVersion="2.1.10.1"
          txtFileVersion="JSPWiki ${jspwiki.woas.version}"
          fileDescription="WikiOnAStick"
          copyright="Apache Software Licence 2.0"
          productVersion="2.1.10.1"
          txtProductVersion="JSPWiki ${jspwiki.woas.version}"
          productName="WikiOnAStick"
          companyName="Apache Software Foundation"
          internalName="woas"
          originalFilename="woas.exe"
        />        
      </config>  
    </launch4j>
  </target>    

Some notes along the line

  • Launch4J allows to set the current working directory of the Tomcat instance therefore all Tomcat properties are bootstrapped for the current working directory
  • I cheated here by providing a manually packaged "tomcat-launcher-7.0.52.jar" which contains "bootstrap.jar" and "tomcat-juli.jar" - I think there is a way to avoid this but I have to test it on an Windows box



  • No labels