Administering Apache Geronimo With Custom Server Assemblies and Maven. David Jencks

Similar documents
J2EE Development with Apache Geronimo 1.1. Aaron Mulder CTO, Chariot Solutions Committer, Apache Geronimo

Introducing Apache Geronimo 1.1. Aaron Mulder CTO, Chariot Solutions Committer, Apache Geronimo

Administering Apache Geronimo 2.x. David Jencks

Working with Geronimo Plugins

What is Maven? Apache Maven is a software project management and comprehension tool (build, test, packaging, reporting, site, deploy).

7.1. RELEASE-NOTES-2.0-M1.TXT

Geronimo Server Release Process

J2EE Development with Apache Geronimo. Aaron Mulder Chariot Solutions

J2EE Development with Apache Geronimo. Aaron Mulder Chariot Solutions

MAVEN INTERVIEW QUESTIONS

MAVEN MOCK TEST MAVEN MOCK TEST I

J2EE Development with Apache Geronimo. Aaron Mulder Chariot Solutions

Apache Geronimo 3.0 Deep Dive

Setting up a Maven Project

Maven Introduction to Concepts: POM, Dependencies, Plugins, Phases

Apache Maven. Created by anova r&d bvba

SOA-14: Continuous Integration in SOA Projects Andreas Gies

Simplified Build Management with Maven

Maven. INF5750/ Lecture 2 (Part II)

Topics covered. Introduction to Maven Maven for Dependency Management Maven Lifecycles and Plugins Hands on session. Maven 2

Repository Management and Sonatype Nexus. Repository Management and Sonatype Nexus

Red Hat JBoss Fuse 6.1

Session 24. Spring Framework Introduction. Reading & Reference. dev.to/lechatthecat/how-to-use-spring-boot-java-web-framework-withintellij-idea-202p

Struts 2 Maven Archetypes

Maven in the wild. An introduction to Maven

Content. Development Tools 2(57)

Coherence Managed Servers

Apache Geronimo: A Peek Under the Hood

Apache Geronimo 2.1 Quick Reference

Chapter 1: First steps with JAX-WS Web Services

Sonatype CLM - IDE User Guide. Sonatype CLM - IDE User Guide

This article is an attempt to cover as many administrative tasks as possible, common and not so common tasks. This article is grouped in four

Package Management and Build Tools

Sonatype CLM Enforcement Points - Nexus. Sonatype CLM Enforcement Points - Nexus

Getting started with Geomajas. Geomajas Developers and Geosparc

I Got My Mojo Workin'

Creating Custom Builder Components

DevOps and Maven. Eamonn de Leastar Dr. Siobhán Drohan Produced by:

COPYRIGHTED MATERIAL. Getting Started with Geronimo. Where to Find Geronimo

Apache Geronimo. Open Source Application Server. NY Java SIG December 15, 2004

The Actual Real World at EclipseCon/ALM

MAVEN MOCK TEST MAVEN MOCK TEST IV

Component based Development. Table of Contents. Notes. Notes. Notes. Web Application Development. Zsolt Tóth

HP Operations Orchestration

HP Operations Orchestration

Maven 2 & Continuum. by Trygve Laugstøl

JBoss to Geronimo - EJB-MDB Migration

sites</distribsiteroot>

Unable To The Artifact From Any Repository Maven-clean-plugin

David Blevins State of OpenEJB 3.0

Apache Isis Maven plugin

Maven POM project modelversion groupid artifactid packaging version name

Apache Maven: Best Practices

Hello Maven. TestNG, Eclipse, IntelliJ IDEA. Óbuda University, Java Enterprise Edition John von Neumann Faculty of Informatics Lab 2.

Apache Maven MarsJUG. Arnaud Héritier exo platform Software Factory Manager

Example ear-testing can be browsed at

ONAP Developer Typical Setup 2017 July ONAP Virtual Developers Event

Fat / Uber jars - Using the Shade Plugin

Red Hat JBoss Fuse 6.2.1

... Maven.... The Apache Maven Project

Tuscany: Applying OSGi modularity after the fact

Apache Geronimo: Best Practices

Produced by. Agile Software Development. Eamonn de Leastar

IBM. IBM WebSphere Application Server Migration Toolkit. WebSphere Application Server. Version 9.0 Release

Developing and Testing Java Microservices on Docker. Todd Fasullo Dir. Engineering

Red Hat JBoss Fuse 6.3

Action Developers Guide

Application prerequisites

After extracting the zip file a ldap-jetty directory is created, from now on this directory will be referred as <ldap_home>.

IBM Rational Software

Talend ESB. Getting Started Guide 5.2.1

Oracle Corporation

Red Hat JBoss Fuse 6.0

FROM NOTHING TO COMPLETE ENVIRONMENT WITH MAVEN, OOMPH & DOCKER. Max Bureck, 21. June 2017

juddi Developer Guide

JDO Tools Guide (v5.1)

Set up Maven plugins in Eclipse. Creating a new project

AppDev StudioTM 3.2 SAS. Migration Guide

JBoss to Geronimo - EJB-Session Beans Migration

... Apache Maven PDF Plugin v. 1.4 User Guide.... The Apache Software Foundation

IBM Rational Automation Framework for WebSphere

Contents. Enterprise Systems Maven and Log4j. Maven. What is maven?

Cluster-Enabling Sakai with Terracotta

1. What is This Guide about / Goals The Project JGuard Configuration... 11

Skyway Builder 6.3 Reference

Managing Installations and Provisioning of OSGi Applications. Carsten Ziegeler

GlassFish V3 Engineer's guide

European Commission. e-trustex Installation Guide. EUROPEAN COMMISSION DIRECTORATE-GENERAL INFORMATICS Information systems Directorate

SOA-14: Continuous Integration in SOA Projects Andreas Gies

Tattletale. What is Tattletale? Enterprise archives JBoss Application Server 7 Putting it all together Roadmap

Cheat Sheet: Wildfly Swarm

MAVEN MOCK TEST MAVEN MOCK TEST III

Jenkins User Conference Israel. #jenkinsconf. CI / Liveperson. Gidi Samuels. July 16, #jenkinsconf

Red Hat JBoss Fuse 6.3

KS CM 2.0 Implementation and Deployment Guide

CONTINUOUS DELIVERY IN THE ORACLE CLOUD

GAVIN KING RED HAT CEYLON SWARM

Red Hat Fuse 7.0 Installing on Apache Karaf

An Architecture for Self-Organizing Continuous Delivery Pipelines

Maven Plugin Guide OpenL Tablets BRMS Release 5.16

Transcription:

Administering Apache Geronimo With Custom Server Assemblies and Maven David Jencks 1

What is Geronimo? JavaEE 5 certified application server from Apache Modular construction Wires together other projects OpenEJb ActiveMQ Jetty, Tomcat Cxf, Axis2 MyFaces 2

Geronimo Philosophy Package configuration and code together into reusable units (plugins) Expose limited customization options Expose dependency information Use the exposed information to assemble a server containing the desired functionality (your apps) together with the infrastructure needed to run it (EE containers) 3

What is Maven? Build and project management system that explicitly encodes the relationship of your project modules to all other software. Provides a naming and distribution system for software artifacts 4

Geronimo with Maven Both use the same repository structure Maven includes more/different metadata about multiple versions and build instructions Geronimo includes more geronimo specific dependency information and customization info Possible to do without maven but harder to script harder to get in scm 5

Traditional Server Configuration App server is regarded as monolithic black box Configuration scripts are applied to server Applications are deployed into server Unclear how to determine the configuration state of a server instance 6

Geronimo configuration with Maven Your application is the center Maven packages configuration with the application to form a plugin Dependency info packaged with plugin, derived from maven dependency info Plugin deployed to maven repository providing distribution mechanism Custom Server can be assembled around app and deployed to maven repo Everything is in scm... it is part of your build 7

What s a Geronimo Plugin? Deployed artifact with additional metadata Examples: bunch of files to install, no classloader (rare) a classloader with parents and jars classloader with geronimo services (gbeans) deployed javaee app with classloader and gbeans 8

Plugin metadata Metadata includes cataloging information (name, description, category) environment dependencies (jdk) installation dependencies (other plugins and jars) exposed configuration replacement information (artifact-aliases) instructions on what to unpack on installation spring xml files data files log4j configuration 9

Geronimo plans All plugins need a plan src/main/plan/plan.xml in maven project type depends on kind of plugin system module (gbeans only) javaee app (plan similar to ee dd) admin console has wizards copy and modify examples geronimo is assembled from plugins 10

Access to Geronimo plugins Geronimo plugin repo (looks like a maven repo) Geronimo server (if it has a web server installed) Local maven repo - local builds install plugins Remote maven repo such as a repository manager (e.g. nexus) Plugin catalog is helpful for manual assembly. 11

Server Customization Install different plugins plugins can indicate they substitute for another using artifact aliases Configure plugins plugins can expose properties for customization in config substitutions. Initial values are supplied in the plugin When assembling a server, property customizations can be installed 12

Example of plugin substitution Developers need independent clean environment derby db and properties security realm default plugins QA needs realistic non-production environment production db and ldap copies qa plugins Production needs isolated environment production plugins 13

project structure my-app (ear, perhaps) my-app-jetty-cxf (pluginized-ear) dependencies on dev plugins db-dev (embedded derby) security-dev (local property files) db-qa (isolated db2) aliased to replace dev plugin security-qa (isolated apacheds) db-production (production db2) security-production (production ldap) server-dev server-qa server-production 14

Service Customization Services (gbeans) configured in geronimo plan Overrides in config.xml Overrides can use ${property} Property values from configsubstitutions.properties 15

plan: <gbean name="jettywebconnector" class="org.apache.geronimo.jetty6.connector.httpselectchannelconnector"> <attribute name="host">localhost</attribute> <attribute name="port">8080</attribute> <attribute name="headerbuffersizebytes">8192</attribute> <reference name="jettycontainer"> <name>jettywebcontainer</name> </reference> <reference name="threadpool"> <name>defaultthreadpool</name> </reference> <attribute name="maxthreads">50</attribute> </gbean> config.xml: <gbean name="jettywebconnector"> <attribute name="host">${serverhostname}</attribute> <attribute name="port">${httpport + PortOffset}</attribute> <attribute name="redirectport">${httpsportprimary + PortOffset}</attribute> </gbean> config-substitutions.xml: ServerHostname=localhost HTTPPort=8080 HTTPSPortPrimary=8443 PortOffset=0 16

Plugin Metadata geronimo-plugin.xml file Normally constructed by car-mavenplugin dependencies catalog info (description, category) version info customization options (config.xml content) artifact aliases substitution values unpacking instructions 17

<?xml version="1.0" encoding="utf-8" standalone="yes"?> <geronimo-plugin xmlns="http://geronimo.apache.org/xml/ns/plugins-1.3" xmlns:ns2="http://geronimo.apache.org/ xml/ns/attributes-1.2"> <name>geronimo Plugins, Jetty :: Jetty 6</name> <plugingroup>false</plugingroup> <description>geronimo Jetty Web Server integration.</description> <url>http://geronimo.apache.org/</url> <author>the Apache Geronimo development community</author> <license osi-approved="true">the Apache Software License, Version 2.0</license> <plugin-artifact> <module-id> <groupid>org.apache.geronimo.configs</groupid> <artifactid>jetty6</artifactid> <version>2.2-snapshot</version> <type>car</type> </module-id> <geronimo-version>2.2-snapshot</geronimo-version> <jvm-version>1.5</jvm-version> <jvm-version>1.6</jvm-version> <dependency> <groupid>org.apache.geronimo.configs</groupid> <artifactid>j2ee-server</artifactid> <version>2.2-snapshot</version> <type>car</type> </dependency> ----lots more dependencies, omitted --- <source-repository>~/.m2/repository/</source-repository> <source-repository>http://repo1.maven.org/maven2/</source-repository> <source-repository>http://people.apache.org/repo/m2-snapshot-repository/</source-repository> 18

----continued <config-xml-content> <ns2:gbean name="jettywebconnector"> <ns2:attribute name="host">${serverhostname}</ns2:attribute> <ns2:attribute name="port">${httpport + PortOffset}</ns2:attribute> <ns2:attribute name="redirectport">${httpsportprimary + PortOffset}</ns2:attribute> </ns2:gbean> <ns2:gbean name="jettyajp13connector"> <ns2:attribute name="host">${serverhostname}</ns2:attribute> <ns2:attribute name="port">${ajpport + PortOffset}</ns2:attribute> <ns2:attribute name="redirectport">${httpsportprimary + PortOffset}</ns2:attribute> </ns2:gbean> <ns2:gbean name="jettysslconnector"> <ns2:attribute name="host">${serverhostname}</ns2:attribute> <ns2:attribute name="port">${httpsport + PortOffset}</ns2:attribute> </ns2:gbean> </config-xml-content> <artifact-alias key="org.apache.geronimo.configs/jetty6//car"> org.apache.geronimo.configs/jetty6/2.2-snapshot/car</artifact-alias> <artifact-alias key="org.apache.geronimo.configs/jetty6/2.1.4/car"> org.apache.geronimo.configs/jetty6/2.2-snapshot/car</artifact-alias> <config-substitution key="httpport">8080</config-substitution> <config-substitution key="ajpport">8009</config-substitution> <config-substitution key="httpsport">8443</config-substitution> <config-substitution key="webcontainer">jettywebcontainer</config-substitution> <config-substitution key="webcontainername">jetty6</config-substitution> </plugin-artifact> </geronimo-plugin> 19

Unpacking resources pack resources into plugin specify where to unpack <copy-file relative-to="server" dest-dir="var">security</copy-file> examples: tomcat base configuration files property login module files activemq or apacheds spring xml files base server directory structure 20

Building plugins with carmaven-plugin From maven pom: dependencies (can customize scope) also inserted into geronimo plan name description One level of overriding from parent pom e.g. category config.xml contents, artifact aliases, and property values from maven plugin configuration local plugin catalog maintained in local maven repo. 21

Plugin maven project +-src +-main +-plan +-plan.xml //gbeans, g. jee plan +-resources +-myappdata //data to unpack -pom.xml //maven id becomes plugin id //dependencies specify classloader //car-maven-plugin configuration //specifies where to unpack, and //content of configuration files. 22

<plugin> <groupid>org.apache.geronimo.buildsupport</groupid> <artifactid>car-maven-plugin</artifactid> <configuration> <instance> <plugin-artifact> <config-xml-content> <gbean name="jettywebconnector"> <attribute name="host">#{serverhostname}</attribute> <attribute name="port">#{httpport + PortOffset}</attribute> <attribute name="redirectport">#{httpsportprimary + PortOffset}</attribute> </gbean> <gbean name="jettyajp13connector"> <attribute name="host">#{serverhostname}</attribute> <attribute name="port">#{ajpport + PortOffset}</attribute> <attribute name="redirectport">#{httpsportprimary + PortOffset}</attribute> </gbean> <gbean name="jettysslconnector"> <attribute name="host">#{serverhostname}</attribute> <attribute name="port">#{httpsport + PortOffset}</attribute> </gbean> </config-xml-content> <artifact-alias key="org.apache.geronimo.configs/jetty6/2.1.4/car"> org.apache.geronimo.configs/jetty6/2.2-snapshot/car</artifact-alias> <config-substitution key="httpport">8080</config-substitution> <config-substitution key="ajpport">8009</config-substitution> <config-substitution key="httpsport">8443</config-substitution> <config-substitution key="webcontainer">jettywebcontainer</config-substitution> <config-substitution key="webcontainername">jetty6</config-substitution> </plugin-artifact> </instance> 23 </configuration> </plugin>

Assembling a custom server car-maven-plugin with server-assembly packaging list all the plugins you need as dependencies transitive dependencies (through geronimo-plugin.xml, not maven) will be pulled in requires rather unpleasant server model configuration. 24

Server assembly maven project +-src +-main +-resources +-var +-config +-overrides +server-overrides.xml -pom.xml //maven id becomes server id //dependencies specify server //contents, following transitive //dependencies 25

Server models Several servers can be run from one geronimo installation (e.g. main ee server, app client container) Each server has a set of configuration files e.g. var/config/config.xml var/config/config-substitutions.properties var/config/artifact-aliases.properties Metadata about each server is contained in a model indicating where the configuration files are Plugin metadata indicates which model the customization goes into. 26

<project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <parent> <artifactid>activemq</artifactid> <groupid>org.apache.geronimo.plugins</groupid> <version>2.2-snapshot</version> </parent> <modelversion>4.0.0</modelversion> <groupid>org.apache.geronimo.plugins</groupid> <artifactid>activemq-server</artifactid> <packaging>server-assembly</packaging> <name>geronimo ActiveMQ v5 Micro-Server</name> <description>small server for testing activemq v5 integration</description> <dependencies> <dependency> <groupid>org.apache.geronimo.framework.plugingroups</groupid> <artifactid>framework</artifactid> <version>${geronimoversion}</version> <type>car</type> </dependency> <dependency> <groupid>org.apache.geronimo.configs</groupid> <artifactid>activemq-broker</artifactid> <version>${geronimoversion}</version> <type>car</type> </dependency> <dependency> <groupid>org.apache.geronimo.configs</groupid> <artifactid>activemq-ra</artifactid> <version>${geronimoversion}</version> <type>car</type> </dependency> 27

<plugin> <groupid>org.apache.geronimo.buildsupport</groupid> <artifactid>car-maven-plugin</artifactid> <configuration> <!-- put this stuff in a shared parent pom configuration if at all possible --> <servers> <serverinstance> <name>default</name> <configfile>var/config/config.xml</configfile> <configsubstitutionsfile>var/config/config-substitutions.properties</configsubstitutionsfile> <configsubstitutionsprefix>org.apache.geronimo.config.substitution.</configsubstitutionsprefix> <artifactaliasesfile>var/config/artifact_aliases.properties</artifactaliasesfile> </serverinstance> <serverinstance> <name>client</name> <attributemanagerfrom>default</attributemanagerfrom> <artifactaliasesfile>var/config/client_artifact_aliases.properties</artifactaliasesfile> </serverinstance> <serverinstance> <name>offline</name> <configfile>var/config/offline-deployer-config.xml</configfile> <configsubstitutionsfile>var/config/config-substitutions.properties</configsubstitutionsfile> <configsubstitutionsprefix>org.apache.geronimo.config.substitution.</configsubstitutionsprefix> <artifactaliasesfile>var/config/artifact_aliases.properties</artifactaliasesfile> </serverinstance> <serverinstance> <name>jsr88</name> <configfile>var/config/jsr88-configurer-config.xml</configfile> <configsubstitutionsfile>var/config/config-substitutions.properties</configsubstitutionsfile> <configsubstitutionsprefix>org.apache.geronimo.config.substitution.</configsubstitutionsprefix> <artifactaliasesfile>var/config/artifact_aliases.properties</artifactaliasesfile> 28 </serverinstance> </servers>

<configuration> <overrides> <override> <server>default</server> <overrides>server-overrides.xml</overrides> </override> </overrides> </configuration> 29

Doing without maven don t, the process is hard to get in scm admin console has incomplete metadata editing no config.xml, artifact-aliases, properties extract plugin from admin console or gshell extract server from admin console or gshell server is based on plugins, without any manual customizations that may have been done. 30

Framework Server with Plugins Framework server contains just enough functionality to install plugins With the Cluster node plugin the server can join a multicast cluster Scripts or cluster controller can instruct servers to install the plugins of interest Plugins typically on maven repo such as sonatype nexus All required plugins installed as dependencies 31

Maven review projects are multi-module maven archetypes help create new modules one artifact generated per module project-wide configuration in parent project, inherited by sub-modules. geronimo plugin archetype geronimo assembly archetype Easy to run from m2eclipse and (theoretically) idea 32

geronimo-plugin-archetype get archetypes into catalog get archetypes into repo run mvn archetype:crawl mvn archetype-generate supply info requested Move appropriate configuration into parent pom add dependencies add plan add deployers for ee, add ee application add configuration 33

g-p-a gotchas You have to list all the deployers needed as dependencies with scope provided You have to configure all the deployers needed in the car-maven-plugin (properties are suggested to make this easier) You have to include as maven dependencies all the dependencies the deployers add automatically This can all be fixed with a better archetype 34

<project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <parent> <artifactid>activemq</artifactid> <groupid>org.apache.geronimo.plugins</groupid> <version>2.2-snapshot</version> </parent> <modelversion>4.0.0</modelversion> <artifactid>activemq-webconsole-jetty</artifactid> <name>activemq web console on Jetty</name> <packaging>car</packaging> <!-- deployers --> <dependencies> <dependency> <groupid>org.apache.geronimo.framework</groupid> <artifactid>geronimo-gbean-deployer</artifactid> <version>${geronimoversion}</version> <type>car</type> <scope>provided</scope> </dependency> <dependency> <groupid>org.apache.geronimo.configs</groupid> <artifactid>j2ee-deployer</artifactid> <version>${geronimoversion}</version> <type>car</type> <scope>provided</scope> </dependency> <dependency> <groupid>org.apache.geronimo.configs</groupid> <artifactid>${jetty}-deployer</artifactid> <version>${geronimoversion}</version> 35 <type>car</type> <scope>provided</scope>

<!-- server components to run app --> <dependency> <groupid>org.apache.geronimo.configs</groupid> <artifactid>${jetty}</artifactid> <version>${geronimoversion}</version> <type>car</type> </dependency> <dependency> <groupid>org.apache.geronimo.configs</groupid> <artifactid>jasper</artifactid> <version>${geronimoversion}</version> <type>car</type> </dependency> <dependency> <groupid>org.apache.geronimo.configs</groupid> <artifactid>activemq-broker</artifactid> <version>${geronimoversion}</version> <type>car</type> </dependency> <!-- the actual javaee app we re deploying --> <dependency> <groupid>org.apache.geronimo.plugins</groupid> <artifactid>activemq-webconsole</artifactid> <version>${geronimoversion}</version> <type>war</type> <scope>provided</scope> </dependency> 36

<build> <plugins> <plugin> <groupid>org.apache.geronimo.buildsupport</groupid> <artifactid>car-maven-plugin</artifactid> <configuration> <deploymentconfigs> <!-- properties defined in parent pom: refer to deployer plugins --> <deploymentconfig>${gbeandeployer}</deploymentconfig> <deploymentconfig>${j2eedeployer}</deploymentconfig> <deploymentconfig>${jettydeployer}</deploymentconfig> <deploymentconfig>${jasperdeployer}</deploymentconfig> </deploymentconfigs> <!-- when deploying an ee app, list it as a module: --> <module> <groupid>org.apache.geronimo.plugins</groupid> <artifactid>activemq-webconsole</artifactid> <type>war</type> </module> </configuration> </plugin> </plugins> </build> </project> 37

geronimo-assembly-archetype mvn archetype:generate... if you are assembling more than one server, move configuration into parent add framework plugin to dependencies add your app plugins to dependencies Once you install an artifact-alias, the replaced artifact will not be installed 38

Server Customization files Plugins can only install customizations for themselves in config.xml Occasionally that is not enough. Include additional customization files in src/main/ resources/var/config/overrides/<server-name>overrides.xml Configure car-maven-plugin for server assembly <configuration> <overrides> <override> <server>default</server> <overrides>server-overrides.xml</overrides> </override> </overrides> </configuration> 39

Sample server customization <attributes xmlns="http://geronimo.apache.org/xml/ns/attributes-1.2"> <module name="org.apache.geronimo.framework/j2ee-security/${geronimoversion}/car"> <!-- Turn off a single gbean in a plugin --> <gbean name="securityservice" load="false"/> </module> <!-- don t load a plugin at all --> <module name="org.apache.geronimo.framework/server-security-config/${geronimoversion}/car" load="false"/> <module name="org.apache.geronimo.configs/activemq-ra/${geronimoversion}/car" load="false"/> <!-- override some settings not exposed as config-substitutions --> <module name="org.apache.geronimo.configs/j2ee-corba-yoko/${geronimoversion}/car"> <gbean name="corbasslconfig"> <attribute name="keystore">clientcert.jks</attribute> <attribute name="keyalias">cts</attribute> <attribute name="truststore">ssl-truststore</attribute> <attribute name="protocol">ssl</attribute> </gbean> <gbean name="nameserver"> <attribute name="port">${orbdefaultport}</attribute> </gbean> <gbean name="server"> <attribute name="port">6684</attribute> <attribute name="host">localhost</attribute> </gbean> </module>... 40

Plugin based clustering (trunk) Cluster nodes are framework + node plugin Cluster admin node tracks cluster members, plugins, plugin lists. Multicast discovery When a new node is detected it is instructed to install the appropriate plugins. All plugins and dependencies downloaded from a plugin repo Does not solve provisioning problem of distributing and starting the node servers. Cute but just distributing custom servers may be simpler 41

Summary Plugins include maven-style dependency information Installing a plugin pulls in all its dependencies Plugins have a customization facility Assembling a server starting with your application plugins pulls in all the server parts needed to run your apps All the configuration is in scm 42