I’ve found various tutorials on creating an embedded tomcat programatically and deploy a web application to it. Unfortunately, non of the tutorials was up to date using Tomcat 8 and actually non was showing how to deploy anything else but a servlet so I decided to write a short tutorial on how to create the server and deploy either a WAR file or a folder containing a non archived web application.
Create a simple Java project in ecplipse, enable maven and add the following dependencies:
<dependencies> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina</artifactId> <version>8.0.21</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-util</artifactId> <version>8.0.21</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>8.0.21</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>7.0.8</version> </dependency> </dependencies> |
Optionally, you can enable the maven-assembly-plugin to package your application as JAR at the end and have maven include all dependencies you specified. As build goal you’ll have to use assembly:single.
<plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>de.jofre.embeddedtc.runtime.Main</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> |
Now create the class de.jofre.embeddedtc.runtime.Main (The name is arbitrary) and add write the code according to the next listing:
package de.jofre.embedded.runtime; import java.io.File; import java.util.logging.Logger; import org.apache.catalina.Context; import org.apache.catalina.LifecycleException; import org.apache.catalina.startup.Tomcat; public class Main { private final static Logger LOGGER = Logger.getLogger(Main.class.getName()); private final static String mWorkingDir = System.getProperty("java.io.tmpdir"); private static Tomcat tomcat = null; public static void main(String[] args) { tomcat = new Tomcat(); tomcat.setPort(8080); tomcat.setBaseDir(mWorkingDir); tomcat.getHost().setAppBase(mWorkingDir); tomcat.getHost().setAutoDeploy(true); tomcat.getHost().setDeployOnStartup(true); try { tomcat.start(); } catch (LifecycleException e) { LOGGER.severe("Tomcat could not be started."); e.printStackTrace(); } LOGGER.info("Tomcat started on " + tomcat.getHost()); // Alternatively, you can specify a WAR file as last parameter in the following call e.g. "C:\\Users\\admin\\Desktop\\app.war" Context appContext = Main.getTomcat().addWebapp(Main.getTomcat().getHost(), "/app", "C:\\Users\\admin\\Desktop\\app\\"); LOGGER.info("Deployed " + appContext.getBaseName() + " as " + appContext.getBaseName()); tomcat.getServer().await(); } } |
The last question is how the directory in C:\\Users\\admin\\Desktop\\app\\ respectively the C:\\Users\\admin\\Desktop\\app.war looks like. Well, it contains a simple HTML file…
<html><body>Test</body></html> |
… and another folder called WEB-INF containing the web.xml with the following content:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Test App</display-name> <description>A test app</description> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <session-config> <session-timeout>30</session-timeout> </session-config> </web-app> |
Now if you start the java application you call http://localhost:8080/app and the content of index.html should be displayed. Hope this helps you!