Maven webapp
Maven webapplications are usually not executed by starting the JVM directly. Instead, an application server like Apache Tomcat is started in which webapplications are deployed. An application server provides services to operators who want to configure webapplications without rebuilding them.
Webapplications do network communication using the Hypertext Transfer Protocol (HTTP). First, update the Main class of subsection Maven basics to talk HTTP:
Undo the changes of subsection Execute program by restoring the copy you made at the beginning of that subsection.
Change file
work/src/main/java/org/frankframework/maven/webapp/example/Main.javato become as follows:package org.wearefrank.maven.webapp.example; import org.apache.commons.lang3.StringUtils; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class Main extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException, ServletException { PrintWriter pw = res.getWriter(); pw.println(StringUtils.upperCase("Hello World!")); pw.close(); } }
Link this servlet to the URL that should trigger it. Do so by creating file
work/src/main/webapp/WEB-INF/web.xmland give it the following contents:<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>hello</servlet-name> <servlet-class>org.wearefrank.maven.webapp.example.Main</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/api/hello</url-pattern> </servlet-mapping> </web-app>
Next, the pom.xml is updated:
Update
work/pom.xmlto tell Maven that a.warfile should be produced. Unlike the.jarproduced in the previous subsection, the.warfile includes all dependencies. Update the file as shown:... <groupId>org.wearefrank</groupId> <artifactId>mavenWebappExample</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> ...
Add an additional dependency:
... <artifactId>commons-lang3</artifactId> <version>3.20.0</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> ...
The Java compiler has to resolve the import of class javax.servlet.http.HttpServlet and some other classes. These are found in artifact javax.servlet. Therefore, this artifact is added as a dependency. The artifat does not have to be packaged in the .war however, because every application server should provide the classes of this artifact. This common feature of application servers is required by the Jakarta EE Servlet specification. It explains why there is an additional line <scope>provided</scope> in the pom.xml.
The webapplication is done. It can be executed as follows:
On a command prompt in directory
work, runmvn clean install. A filetarget/mavenWebappExample-1.0-SNAPSHOT.warshould be generated.Download and unzip Apache Tomcat from https://tomcat.apache.org/download-90.cgi. These instructions were tested on January 30 2024 for Tomcat version 9.0.85. In that test, the source code was built with Java 11.
Go to the root directory of the unzipped Tomcat download, for example
C:\Users\martijn\temp\apache-tomcat-9.0.85.That directory has subdirectory
webapps. Put your.warfile inside subdirectorywebappsand name itmavenWebappExample.war.The Tomcat installation directory also has a subdirectory
bin. Enter that directory.Start Tomcat by running
startup.bat(under Windows).Open a webbrowser with URL http://localhost:8080/mavenWebappExample/api/hello. This should produce a webpage with the text
HELLO WORLD!, the output from the servlet in classMain.java. The number8080is the port number. The URL/api/hellohas been configured inweb.xmlby tag<url-pattern>.
The Frank!Framework is a Maven webapplication. You have a basic understanding now of what that means. Please study Frank2Example4 at https://github.com/wearefrank/frank-runner now to see how to package Frank configurations inside .war files for deployment. That code can be executed using the Frank!Runner, but it also shows how to organize your files for execution in production without the Frank!Runner.