Jetty deployers - Webapp Deploy Management component
npx @tessl/cli install tessl/maven-org-eclipse-jetty--jetty-deploy@12.0.0Jetty Deploy provides a comprehensive web application deployment management system for the Eclipse Jetty web server. It implements a sophisticated deployment lifecycle management framework that can automatically detect, deploy, start, stop, and undeploy web applications from various sources including file system directories, WAR files, and other deployable artifacts.
pom.xml:<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-deploy</artifactId>
<version>12.0.21</version>
</dependency>import org.eclipse.jetty.deploy.DeploymentManager;
import org.eclipse.jetty.deploy.App;
import org.eclipse.jetty.deploy.AppProvider;
import org.eclipse.jetty.deploy.providers.ContextProvider;import org.eclipse.jetty.deploy.DeploymentManager;
import org.eclipse.jetty.deploy.providers.ContextProvider;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
// Create deployment manager
DeploymentManager deploymentManager = new DeploymentManager();
deploymentManager.setContexts(new ContextHandlerCollection());
// Add a context provider for scanning webapps
ContextProvider contextProvider = new ContextProvider();
contextProvider.setMonitoredDirName("webapps");
deploymentManager.addAppProvider(contextProvider);
// Add to server
Server server = new Server(8080);
server.addBean(deploymentManager);
server.start();Jetty Deploy is built around several key components:
Core deployment orchestration functionality providing centralized control over application lifecycles, provider management, and state coordination.
public class DeploymentManager extends ContainerLifeCycle {
public DeploymentManager();
public void addApp(App app);
public void addAppProvider(AppProvider provider);
public void requestAppGoal(App app, String nodeName);
public Collection<App> getApps();
public App getApp(String appId);
public void undeployAll();
}Provider system for discovering and deploying applications from various sources like directories, WAR files, and XML descriptors.
public interface AppProvider extends LifeCycle {
void setDeploymentManager(DeploymentManager deploymentManager);
ContextHandler createContextHandler(App app) throws Exception;
String getEnvironmentName();
}
public class ContextProvider extends ScanningAppProvider {
public ContextProvider();
public void setMonitoredDirName(String dir);
public void setScanInterval(int scanInterval);
}State machine-based deployment lifecycle with standard states, bindings, and transition management.
public class AppLifeCycle extends Graph {
public static final String UNDEPLOYED = "undeployed";
public static final String DEPLOYING = "deploying";
public static final String DEPLOYED = "deployed";
public static final String STARTING = "starting";
public static final String STARTED = "started";
public static final String STOPPING = "stopping";
public static final String UNDEPLOYING = "undeploying";
public static final String FAILED = "failed";
public void addBinding(AppLifeCycle.Binding binding);
public void runBindings(Node node, App app, DeploymentManager deploymentManager) throws Throwable;
}Directed graph system for modeling deployment states, transitions, and path finding through the deployment lifecycle.
public class Graph {
public Graph();
public void addNode(Node node);
public void addEdge(Edge edge);
public Route getPath(Node from, Node to);
public Set<Node> getNodes();
}
public final class Node {
public Node(String name);
public String getName();
}public class App {
public App(DeploymentManager manager, AppProvider provider, Path path);
public DeploymentManager getDeploymentManager();
public AppProvider getAppProvider();
public Path getPath();
public String getContextPath();
public ContextHandler getContextHandler() throws Exception;
public Map<String, String> getProperties();
}
public static class DeploymentManager.AppEntry {
public App getApp();
public Node getLifecyleNode();
public Map<Node, Long> getStateTimestamps();
public int getVersion();
}public interface AppLifeCycle.Binding {
String[] getBindingTargets();
void processBinding(Node node, App app) throws Exception;
}public final class Edge {
public Edge(Node from, Node to);
public Node getFrom();
public Node getTo();
}
public class Route {
public Route();
public void add(Edge edge);
public List<Node> getNodes();
public Node firstNode();
public Node lastNode();
public boolean isEmpty();
}