Can some code run the first time the WAR file is deployed?

Is there any method or API that I can use so that whenever I deploy a new WAR file, part of the code should be executed, or perhaps when Tomcat starts, the corresponding servlet should run or run some code continuously.

+6
tomcat web-deployment
source share
3 answers

The revival of the old question, as the only answer does not show any example.

To run a custom piece of code whenever a WAR web application is deployed / not deployed or Tomcat starts / stops, you need to:

  • Implement the ServletContextListener listener and its contextInitialized() and contextDestroyed() methods.
  • Let Tomcat know about your implementation. According to the documentation, you can add an implementation class to the deployment descriptor, annotate it using WebListener or register it using one of the addListener() methods defined on ServletContext .

Here is an example (based on this post ):

 package com.example; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class MyServletContextListener implements ServletContextListener { /** The servlet context with which we are associated. */ private ServletContext context = null; @Override public void contextDestroyed(ServletContextEvent event) { log("Context destroyed"); this.context = null; } @Override public void contextInitialized(ServletContextEvent event) { this.context = event.getServletContext(); log("Context initialized"); } private void log(String message) { if (context != null) { context.log("MyServletContextListener: " + message); } else { System.out.println("MyServletContextListener: " + message); } } } 

And add the following to web.xml (or, alternatively, use the WebListener or addListener() annotation method):

 <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> ... <listener> <listener-class>com.example.MyServletContextListener</listener-class> </listener> </web-app> 
+9
source share

You can include the "ContextListener" in web.xml. An instance of this class will be created when the WAR Webb application is deployed / launched.

This code can start a thread that will run until the application is deployed.

Example: http://www.javafaq.nu/java-example-code-233.html

+6
source share

I find a way to run some code only when deploying the application (* .war): it works, at least for jersey servlets using the Java servlet, using javax.ws.rs.core.Application.

The application in the ApplicationConfig.java file (see below) contains the public getClasses method, which is called when the application is deployed. Thus, adding code to getClasses will execute it when you deploy the application. The only thing I noticed is that it is strange that this function is called twice, I don’t know why, so I added a global variable to the ApplicationConfig class to find out if my code is already running.

Here is my solution:

 package eu.oca; import java.util.Set; import javax.ws.rs.core.Application; /** * * @author mattei */ @javax.ws.rs.ApplicationPath("jersey") public class ApplicationConfig extends Application { private boolean alreadyRun = false; @Override public Set<Class<?>> getClasses() { System.out.println("Sidonie : ApplicationConfig : getClasses : alreadyRun = " + String.valueOf(alreadyRun)); alreadyRun = true; Set<Class<?>> resources = new java.util.HashSet<>(); addRestResourceClasses(resources); return resources; } /** * Do not modify addRestResourceClasses() method. * It is automatically populated with * all resources defined in the project. * If required, comment out calling this method in getClasses(). */ private void addRestResourceClasses(Set<Class<?>> resources) { resources.add(eu.oca.ResultatGeneralAF.class); resources.add(eu.oca.ResultatGeneralF.class); resources.add(eu.oca.ResultatMesuresAF.class); resources.add(eu.oca.ResultatMesuresF.class); resources.add(eu.oca.SidonieAccueilD.class); resources.add(eu.oca.SidonieWelcomeR.class); } } 
0
source share

All Articles