# WildFly Application Server (WildFly) Quickstarts

> The quickstarts demonstrate Java EE 7 and a few additional technologies from the JBoss stack. They provide small, specific, working examples that can be used as a reference for your own project.

## Introduction

These quickstarts run on WildFly Application Server 13 or later. We recommend using the WildFly ZIP file. This version uses the correct dependencies and ensures you test and compile against your runtime environment.

Make sure you read this entire document before you attempt to work with the quickstarts. It contains the following information:

- Available Quickstarts: List of the available quickstarts and details about each one.

- Suggested Approach to the Quickstarts: A suggested approach on how to work with the quickstarts.

- System Requirements: List of software required to run the quickstarts.

- Configure Maven: How to configure the Maven repository for use by the quickstarts.

- Run the Quickstarts: General instructions for building, deploying, and running the quickstarts.

- Run the Arquillian Tests: How to run the Arquillian tests provided by some of the quickstarts.

- Optional Components: How to install and configure optional components required by some of the quickstarts.

- Contributing Guide: This document contains information targeted for developers who want to contribute to JBoss developer projects.

## Use of WILDFLY_HOME and JBOSS_HOME Variables

The quickstart `README` files use the replaceable value `WILDFLY_HOME` to denote the path to the WildFly installation. When you encounter this value in a `README` file, make sure you replace it with the actual path to your WildFly installation. The installation path is described in detail here: Use of WILDFLY_HOME and JBOSS_HOME Variables.

## Available Quickstarts

All available quickstarts can be found here: https://github.com/wildfly/quickstart/. You can review the technologies demonstrated by the quickstart. You can also view the required experience level. Click on the quickstart to see more detailed information about how to run it. Some quickstarts require deployment of other quickstarts. This information is noted in the `Prerequisites` section of the quickstart `README` file.

Note | Some of these quickstarts use the H2 database included with WildFly. It is a lightweight, relational example datasource that is used for examples only. It is not robust or scalable, is not supported, and should NOT be used in a production environment!

Quickstart Name | Demonstrated Technologies | Description | Experience Level Required | Prerequisites
--- | --- | --- | --- | ---
app-client | EJB, EAR, AppClient | The `app-client` quickstart demonstrates how to code and package a client app and use the WildFly client container to start the client `Main` program. | Intermediate | none
batch-processing | CDI, Batch 1.0, JSF | The `batch-processing` quickstart shows how to use chunk oriented batch jobs to import a file to a database. | Intermediate | none
bean-validation | CDI, JPA, BV | The `bean-validation` quickstart provides Arquillian tests to demonstrate how to use CDI, JPA, and Bean Validation. | Beginner | none
bean-validation-custom-constraint | CDI, JPA, BV | The `bean-validation-custom-constraint` quickstart demonstrates how to use the Bean Validation API to define custom constraints and validators. | Beginner | none
bmt | EJB, BMT | The `bmt` quickstart demonstrates Bean-Managed Transactions (BMT), showing how to manually manage transaction demarcation while accessing JPA entities. | Intermediate | none
cmt | EJB, CMT, JMS | The `cmt` quickstart demonstrates Container-Managed Transactions (CMT), showing how to use transactions managed by the container. | Intermediate | none
contacts-jquerymobile | jQuery Mobile, jQuery, JavaScript, HTML5, REST | The `contacts-jquerymobile` quickstart demonstrates a Java EE 7 mobile database application using HTML5, jQuery Mobile, JAX-RS, JPA, and REST. | Beginner | none
deltaspike-authorization | JSF, CDI, Deltaspike | Demonstrate the creation of a custom authorization example using @SecurityBindingType from DeltaSpike | Beginner | none
deltaspike-beanbuilder | CDI, DeltaSpike | Shows how to create new beans using DeltaSpike utilities. | Advanced | none
deltaspike-projectstage | JSF, CDI, Deltaspike | Demonstrate usage of DeltaSpike project stage and shows usage of a conditional @Exclude | Beginner | none
ejb-asynchronous | Asynchronous EJB | The `ejb-asynchronous` quickstart demonstrates the behavior of asynchronous EJB invocations by a deployed EJB and a remote client and how to handle errors. | Advanced | none
ejb-in-ear | EJB, EAR | The `ejb-in-ear` quickstart demonstrates how to deploy an EAR archive that contains a JSF WAR and an EJB JAR. | Intermediate | none
ejb-in-war | EJB, JSF, WAR | The `ejb-in-war` quickstart demonstrates how to package an EJB bean in a WAR archive and deploy it to WildFly. Arquillian tests are also provided. | Intermediate | none
ejb-multi-server | EJB, EAR | The `ejb-multi-server` quickstart shows how to communicate between multiple applications deployed to different servers using an EJB to log the invocation. | Advanced | none
ejb-remote | EJB, JNDI | The `ejb-remote` quickstart uses EJB and JNDI to demonstrate how to access an EJB, deployed to WildFly, from a remote Java client application. | Intermediate | none
ejb-security | EJB, Security | The `ejb-security` quickstart demonstrates the use of Java EE declarative security to control access to EJBs in WildFly. | Intermediate | none
ejb-security-context-propagation | EJB, Security | The `ejb-security-context-propagation` quickstart demonstrates how the security context can be propagated to a remote EJB using a remote outbound connection configuration | Advanced | none
ejb-security-jaas | EJB, Security | The `ejb-security-jaas` quickstart demonstrates how legacy `JAAS` security domains can be used in conjunction with `Elytron` | Intermediate | none
ejb-security-programmatic-auth | EJB, Security | The `ejb-security-programmatic-auth` quickstart demonstrates how to programmatically setup different identities when invoking a remote secured EJB. | Intermediate | none
ejb-throws-exception | EJB, EAR | The `ejb-throws-exception` quickstart demonstrates how to throw and handle exceptions across JARs in an EAR. | Intermediate | none
ejb-timer | EJB Timer | The `ejb-timer` quickstart demonstrates how to use the EJB timer service `@Schedule` and `@Timeout` annotations with WildFly. | Beginner | none
greeter | CDI, JSF, JPA, EJB, JTA | The `greeter` quickstart demonstrates the use of CDI, JPA, JTA, EJB and JSF in WildFly. | Beginner | none
ha-singleton-deployment | EJB, Singleton Deployments, Clustering | The `ha-singleton-deployment` quickstart demonstrates the recommended way to deploy any service packaged in an application archive as a cluster-wide singleton. | Advanced | none
ha-singleton-service | MSC, Singleton Service, Clustering | The `ha-singleton-service` quickstart demonstrates how to deploy a cluster-wide singleton MSC service. | Advanced | none
helloworld | CDI, Servlet | The `helloworld` quickstart demonstrates the use of CDI and Servlet 3 and is a good starting point to verify WildFly is configured correctly. | Beginner | none
helloworld-classfiletransformer | ClassLoading | This is a WAR based application showing you how Wildfly let you apply a ClassTransformer to the classes in your enterprise archive. | Advanced | none
helloworld-html5 | CDI, JAX-RS, HTML5 | The `helloworld-html5` quickstart demonstrates the use of CDI 1.2 and JAX-RS 2.0 using the HTML5 architecture and RESTful services on the backend. | Beginner | none
helloworld-jms | JMS | The `helloworld-jms` quickstart demonstrates the use of external JMS clients with WildFly. | Intermediate | none
helloworld-mbean | CDI, JMX, MBean | The `helloworld-mbean` quickstart demonstrates the use of CDI and MBean in WildFly and includes JConsole instructions and Arquillian tests. | Intermediate | none
helloworld-mdb | JMS, EJB, MDB | The `helloworld-mdb` quickstart uses JMS and EJB Message-Driven Bean (MDB) to create and deploy JMS topic and queue resources in WildFly. | Intermediate | none
helloworld-mdb-propertysubstitution | JMS, EJB, MDB | The `helloworld-mdb-propertysubstitution` quickstart demonstrates the use of JMS and EJB MDB, enabling property substitution with annotations. | Intermediate | none
helloworld-mutual-ssl | Mutual SSL, Undertow | The `helloworld-mutual-ssl` quickstart is a basic example that demonstrates mutual SSL configuration in WildFly | Intermediate | none
helloworld-mutual-ssl-secured | Mutual SSL, Security, Undertow | The `helloworld-mutual-ssl-secured` quickstart demonstrates securing a Web application using client mutual SSL authentication and role-based access control | Intermediate | none
helloworld-rf | CDI, JSF, RichFaces | Similar to the `helloworld` quickstart, but with a JSF front end. | Beginner | none
helloworld-rs | CDI, JAX-RS | The `helloworld-rs` quickstart demonstrates a simple Hello World application, bundled and deployed as a WAR, that uses JAX-RS to say Hello. | Intermediate | none
helloworld-singleton | EJB, Singleton | The `helloworld-singleton` quickstart demonstrates an EJB Singleton Bean that is instantiated once and maintains state for the life of the session. | Beginner | none
helloworld-ssl | SSL, Undertow | The `helloworld-ssl` quickstart is a basic example that demonstrates server side SSL configuration in WildFly. | Beginner | none
helloworld-ws | JAX-WS | The `helloworld-ws` quickstart demonstrates a simple Hello World application, bundled and deployed as a WAR, that uses JAX-WS to say Hello. | Beginner | none
hibernate | Hibernate | The `hibernate` quickstart demonstrates how to use Hibernate ORM 5 API over JPA, using Hibernate-Core and Hibernate Bean Validation, and EJB. | Intermediate | none
hibernate4 | Hibernate 4 | This quickstart performs the same functions as the hibernate quickstart, but uses Hibernate 4 for database access. Compare this quickstart to the hibernate quickstart to see the changes needed to run with Hibernate 5. | Intermediate | none
http-custom-mechanism | EJB, Security | The `http-custom-mechanism` quickstart demonstrates how to implement a custom HTTP authentication mechanism that can be registered with Elytron. | Intermediate | none
inter-app | EJB, CDI, JSF | The `inter-app` quickstart shows you how to use a shared API JAR and an EJB to provide inter-application communication between two WAR deployments. | Advanced | none
jaxrs-client | JAX-RS | The `jaxrs-client` quickstart demonstrates JAX-RS Client API, which interacts with a JAX-RS Web service that runs on WildFly. | Beginner | none
jaxrs-jwt | JAX-RS, Security | The `jaxrs-jwt` quickstart demonstrates a JAX-RS secured application using JSON Web Tokens (JWT) with Elytron. | Intermediate | none
jaxws-addressing | JAX-WS | The `jaxws-addressing` quickstart is a working example of the web service using WS-Addressing. | Beginner | none
jaxws-ejb | JAX-WS | The `jaxws-ejb` quickstart is a working example of the web service endpoint created from an EJB. | Beginner | none
jaxws-pojo | JAX-WS | The `jaxws-pojo` quickstart is a working example of the web service endpoint created from a POJO. | Beginner | none
jaxws-retail | JAX-WS | The `jaxws-retail` quickstart is a working example of a simple web service endpoint. | Beginner | none
jsonp | CDI, JSF, JSON-P | The `jsonp` quickstart demonstrates how to use the JSON-P API to produce object-based structures and then parse and consume them as stream-based JSON strings. | Beginner | none
jta-crash-rec | JTA, Crash Recovery | The `jta-crash-rec` quickstart uses JTA and Byteman to show how to code distributed (XA) transactions in order to preserve ACID properties on server crash. | Advanced | none
jts | JTS, EJB, JMS | The `jts` quickstart shows how to use JTS to perform distributed transactions across multiple containers, fulfilling the properties of an ACID transaction. | Intermediate | cmt
jts-distributed-crash-rec | JTS, Crash Recovery | The `jts-distributed-crash-rec` quickstart uses JTS and Byteman to demonstrate distributed crash recovery across multiple application servers. | Advanced | jts
kitchensink | CDI, JSF, JPA, EJB, JAX-RS, BV | The `kitchensink` quickstart demonstrates a Java EE 7 web-enabled database application using JSF, CDI, EJB, JPA, and Bean Validation. | Intermediate | none
kitchensink-angularjs | AngularJS, CDI, JPA, EJB, JPA, JAX-RS, BV | The `kitchensink-angularjs` quickstart demonstrates a Java EE 7 application using AngularJS with JAX-RS, CDI, EJB, JPA, and Bean Validation. | Intermediate | none
kitchensink-ear | CDI, JSF, JPA, EJB, JAX-RS, BV, EAR | The `kitchensink-ear` quickstart demonstrates web-enabled database application, using JSF, CDI, EJB, JPA, and Bean Validation, packaged as an EAR. | Intermediate | none
kitchensink-jsp | JSP, JSTL, CDI, JPA, EJB, JAX-RS, BV | The `kitchensink-jsp` quickstart demonstrates how to use JSP, JSTL, CDI, EJB, JPA, and Bean Validation in WildFly. | Intermediate | none
kitchensink-ml | CDI, JSF, JPA, EJB, JAX-RS, BV, i18n, l10n | The `kitchensink-ml` quickstart demonstrates a localized Java EE 7 compliant application using JSF, CDI, EJB, JPA, and Bean Validation. | Intermediate | none
kitchensink-utjs-angularjs | Undertow.js, Angular.js | Based on kitchensink, but uses a Angular for the front end and Undertow.js for the back end. | Intermediate | none
kitchensink-utjs-mustache | Undertow.js, Mustache | Based on kitchensink, but uses Mustache for the front end and Undertow.js for the back end. | Intermediate | none
logging | Logging | The `logging` quickstart demonstrates how to configure different logging levels in WildFly. It also includes an asynchronous logging example. | Intermediate | none
logging-tools | JBoss Logging Tools | The `logging-tools` quickstart shows how to use JBoss Logging Tools to create internationalized loggers, exceptions, and messages and localize them. | Beginner | none
mail | JavaMail, CDI, JSF | The `mail` quickstart demonstrates how to send email using CDI and JSF and the default Mail provider that ships with WildFly. | Beginner | none
managed-executor-service | EE Concurrency Utilities, JAX-RS, JAX-RS Client API | The `managed-executor-service` quickstart demonstrates how Java EE applications can submit tasks for asynchronous execution. | Beginner | none
messaging-clustering | JMS, MDB | The `messaging-clustering` quickstart does not contain any code and instead uses the `helloworld-mdb` quickstart to demonstrate clustering using ActiveMQ Messaging. | Intermediate | helloworld-mdb
messaging-clustering-singleton | JMS, MDB, Clustering | The `messaging-clustering-singleton` quickstart uses a JMS topic and a queue to demonstrate clustering using WildFly messaging with MDB singleton configuration where only one node in the cluster will be active. | Advanced | none
numberguess | CDI, JSF | The `numberguess` quickstart demonstrates the use of CDI (Contexts and Dependency Injection) and JSF (JavaServer Faces) in WildFly. | Beginner | none
payment-cdi-event | CDI, JSF | The `payment-cdi-event` quickstart demonstrates how to create credit and debit CDI Events in WildFly, using a JSF front-end client. | Beginner | none
resteasy-jaxrs-client | JAX-RS, CDI | The `resteasy-jaxrs-client` quickstart demonstrates an external JAX-RS RestEasy client, which interacts with a JAX-RS Web service that uses CDI and JAX-RS. | Intermediate | helloworld-rs
security-domain-to-domain | Servlet, EJB, Security | The `security-domain-to-domain` quickstart demonstrates the propagation of an identity across two different deployments using different security domains. | Advanced | none
servlet-async | Asynchronous Servlet, CDI, EJB | The `servlet-async` quickstart demonstrates how to use asynchronous servlets to detach long-running tasks and free up the request processing thread. | Intermediate | none
servlet-filterlistener | Servlet Filter, Servlet Listener | The `servlet-filterlistener` quickstart demonstrates how to use Servlet filters and listeners in an application. | Intermediate | none
servlet-security | Servlet, Security | The `servlet-security` quickstart demonstrates the use of Java EE declarative security to control access to Servlets and Security in WildFly. | Intermediate | none
shopping-cart | SFSB EJB | The `shopping-cart` quickstart demonstrates how to deploy and run a simple Java EE 7 shopping cart application that uses a stateful session bean (SFSB). | Intermediate | none
spring-greeter | Spring MVC, JSP, JPA | The `spring-greeter` quickstart is based on the `greeter` quickstart, but differs in that it uses Spring MVC for Mapping `GET` and `POST` requests. | Beginner | none
spring-kitchensink-basic | JSP, JPA, JSON, Spring, JUnit | The `spring-kitchensink-basic` quickstart is an example of a Java EE 7 application using JSP, JPA and Spring 4.x. | Intermediate | none
spring-kitchensink-springmvctest | JSP, JPA, JSON, Spring, JUnit | The `spring-kitchensink-springmvctest` quickstart demonstrates how to create an MVC application using JSP, JPA and Spring 4.x. | Intermediate | none
spring-resteasy | Resteasy, Spring | The `spring-resteasy` quickstart demonstrates how to package and deploy a web application that includes resteasy-spring integration. | Beginner | none
tasks-jsf | JSF, JPA | The `tasks-jsf` quickstart demonstrates how to use JPA persistence with JSF as the view layer. | Intermediate | tasks
tasks-rs | JPA, JAX-RS | The `tasks-rs` quickstart demonstrates how to implement a JAX-RS service that uses JPA persistence. | Intermediate | tasks
temperature-converter | CDI, JSF, SLSB EJB | The `temperature-converter` quickstart does temperature conversion using an EJB Stateless Session Bean (SLSB), CDI, and a JSF front-end client. | Beginner | none
thread-racing | Batch, CDI, EE Concurrency, JAX-RS, JMS, JPA, JSON, Web Sockets | A thread racing web application that demonstrates technologies introduced or updated in the latest Java EE specification. | Beginner | none
websocket-client | Web Socket, CDI Events, JSON, SSL | Demonstrates use of a Javascript WebSocket client, WebSocket configuration, programmatic binding, and secure WebSocket. | Intermediate | none
websocket-endpoint | CDI, WebSocket, JSON-P | Shows how to use WebSockets with JSON to broadcast information to all open WebSocket sessions in WildFly. | Beginner | none
websocket-hello | WebSocket, CDI, JSF | The `websocket-hello` quickstart demonstrates how to create a simple WebSocket application. | Beginner | none
wicket-ear | Apache Wicket, JPA | Demonstrates how to use the Wicket Framework 7.x with the JBoss server using the Wicket Java EE integration, packaged as an EAR | Intermediate | none
wicket-war | Apache Wicket, JPA | Demonstrates how to use the Wicket Framework 7.x with the JBoss server using the Wicket Java EE integration packaged as a WAR | Intermediate | none
wsat-simple | WS-AT, JAX-WS | The `wsat-simple` quickstart demonstrates a WS-AT (WS-AtomicTransaction) enabled JAX-WS Web service, bundled as a WAR, and deployed to WildFly. | Intermediate | none
wsba-coordinator-completion-simple | WS-BA, JAX-WS | The `wsba-coordinator-completion-simple` quickstart deploys a WS-BA (WS Business Activity) enabled JAX-WS Web service WAR (CoordinatorCompletion protocol). | Intermediate | none
wsba-participant-completion-simple | WS-BA, JAX-WS | The `wsba-participant-completion-simple` quickstart deploys a WS-BA (WS Business Activity) enabled JAX-WS Web service WAR (ParticipantCompletion Protocol). | Intermediate | none
xml-jaxp | JAXP, SAX, DOM, Servlet | The `xml-jaxp` quickstart demonstrates how to use Servlet and JSF to upload an XML file to WildFly and validate and parse it using DOM or SAX. | Intermediate | none

## Suggested Approach to the Quickstarts

We suggest you approach the quickstarts as follows:

- Regardless of your level of expertise, we suggest you start with the `helloworld` quickstart. It is the simplest example and is an easy way to prove your server is configured and started correctly.

- If you are a beginner or new to JBoss, start with the quickstarts labeled `Beginner`, then try those marked as `Intermediate`. When you are comfortable with those, move on to the `Advanced` quickstarts.

- Some quickstarts are based upon other quickstarts but have expanded capabilities and functionality. If a prerequisite quickstart is listed, make sure you deploy and test it before looking at the expanded version.

## System Requirements

The applications these projects produce are designed to be run on WildFly Application Server 13 or later.

All you need to build these projects is Java 8.0 (Java SDK 1.8) or later and Maven 3.3.1 or later. See Configure Maven to Build and Deploy the Quickstarts to make sure you are configured correctly for testing the quickstarts.

To run these quickstarts with the provided build scripts, you need the WildFly distribution ZIP. For information on how to install and run JBoss, see the Getting Started Guide located on the Red Hat Customer Portal.

You can also run the quickstarts in JBoss Developer Studio or Eclipse.

## Run the Quickstarts

The root folder of each individual quickstart contains a `README` file with specific details on how to build and run the example. In most cases you do the following:

- Start the WildFly Server

- Build and Deploy the Quickstarts

### Build and Deploy the Quickstarts

See the `README` file in each individual quickstart folder for specific details and information on how to run and access the example.

#### Build the Quickstart Archive

In most cases, you can use the following steps to build the application to test for compile errors or to view the contents of the archive. See the specific quickstart `README` file for complete details.

1. Open a terminal and navigate to the root directory of the quickstart you want to build.

2. Use the following command if you only want to build the archive, but not deploy it.

       $ mvn clean install

#### Build and Deploy the Quickstart

This section describes the basic steps to build and deploy an application. See the specific instructions in each quickstart `README` file for any variations to this process.

1. Make sure you start the WildFly server as described in the quickstart `README` file.

2. Open a terminal and navigate to the root directory of the quickstart you want to run.

3. Use the following command to build and deploy the archive.

       $ mvn clean install wildfly:deploy

#### Undeploy an Archive

Use the following command to undeploy the quickstart.

    $ mvn wildfly:undeploy

### Verify the Quickstarts Build with One Command

You can verify the quickstarts build using one command. However, quickstarts that have complex dependencies must be skipped. For example, the `resteasy-jaxrs-client` quickstart is a RESTEasy client that depends on the deployment of the `helloworld-rs` quickstart. As noted above, the root `pom.xml` file defines a `complex-dependencies` profile to exclude these quickstarts from the root build process.

To build all of the quickstarts:

1. Do not start the WildFly server.

2. Open a terminal and navigate to the root directory of the quickstarts.

3. Use the following command to build the quickstarts that do not have complex dependencies:

       $ mvn clean install '-Pdefault,!complex-dependencies'

### Undeploy the Deployed Quickstarts with One Command

To undeploy the quickstarts from the root of the quickstart folder, you must pass the argument `-fae` (fail at end) on the command line. This allows the command to continue past quickstarts that fail due to complex dependencies and quickstarts that only have Arquillian tests and do not deploy archives to the server.

You can undeploy quickstarts using the following procedure:

1. Start the WildFly server.

2. Open a terminal and navigate to the root directory of the quickstarts.

3. Use the following command to undeploy any deployed quickstarts.

       $ mvn wildfly:undeploy -fae

To undeploy any quickstarts that fail due to complex dependencies, follow the undeploy procedure described in the quickstart’s `README` file.

## Run the Quickstarts in Red Hat JBoss Developer Studio or Eclipse

You can also start the server and deploy the quickstarts or run the Arquillian tests from Eclipse using JBoss tools. For general information about how to import a quickstart, add a WildFly server, and build and deploy a quickstart, see Use JBoss Developer Studio or Eclipse to Run the Quickstarts.

## Optional Components

The following components are needed for only a small subset of the quickstarts. Do not install or configure them unless the quickstart requires it.

- Create Users Required by the Quickstarts: Add a Management or Application user for the quickstarts that run in a secured mode.

- Configure the PostgreSQL Database for Use with the Quickstarts: The PostgreSQL database is used for the distributed transaction quickstarts.

- Configure Byteman for Use with the Quickstarts: This tool is used to demonstrate crash recovery for distributed transaction quickstarts.