type=page
status=published
title={productName} 7 Embedded Server Guide
prev=preface.html
~~~~~~

= {productName} 7 Embedded Server Guide

[[GSESG00001]][[gjldt]]


[[glassfish-server-open-source-edition-embedded-server-guide]]
== 1 {productName} 7 Embedded Server Guide

This document explains how to run applications in embedded {productName} and to develop applications in which
{productName} is embedded. This document is for software developers
who are developing applications to run in embedded {productName}. The
ability to program in the Java language is assumed.

The following topics are addressed here:

* link:#giidt[Introduction to Embedded {productName}]
* link:#gkubb[Embedded {productName} File System]
* link:#giijw[Including the {productName} Embedded Server API in Applications]
* link:#gijhs[Testing Applications with the Maven Plug-in for Embedded {productName}]
* link:#gjlde[Using the EJB 3.1 Embeddable API with Embedded {productName}]
* link:#gjlfe[Changing Log Levels in Embedded {productName}]
* link:#gksmw[Default Java Persistence Data Source for Embedded {productName}]
* link:#gihxf[Restrictions for Embedded {productName}]

[[giidt]][[GSESG00035]][[introduction-to-embedded-glassfish-server]]

=== Introduction to Embedded {productName}

Embedded {productName} enables you to use
{productName} as a library. Embedded {productName} also enables
you to run {productName} inside any Virtual Machine for the Java
platform (Java Virtual Machine or JVMmachine).

No installation or configuration of embedded {productName} is
required. The ability to run {productName} inside applications
without installation or configuration simplifies the process of bundling
{productName} with applications.


[NOTE]
====
Embedded {productName} does not run on the Java Platform, Micro Edition (Java ME platform).
====

You can use embedded {productName} in the following ways:

* With the Embedded Server API (see link:#giijw[Including the {productName} Embedded Server API in Applications])
* With the Maven Plug-in (see link:#gijhs[Testing Applications with the
Maven Plug-in for Embedded {productName}])
* With the EJB 3.1 Embeddable API (see link:#gjlde[Using the EJB 3.1
Embeddable API with Embedded {productName}])

Embedded {productName} provides a plug-in for
http://maven.apache.org/[Apache Maven] (`http://maven.apache.org/`).
This plug-in simplifies the testing of applications by enabling you to
build an application and run it with {productName} on a single
system. Testing and debugging are simplified because the need for an
installed and configured {productName} is eliminated. Therefore, you
can run unit tests automatically in every build.


[NOTE]
====
For information on how to embed {productName} in an OSGi environment,
see the link:add-on-component-development-guide.html#GSACG[{productName} Add-On
Component Development Guide].
====


[[gkubb]][[GSESG00036]][[embedded-glassfish-server-file-system]]

=== Embedded {productName} File System

The following Embedded {productName} directories and files are
important if you are referencing a nonembedded installation of {productName}:

* link:#gikqf[Installation Root Directory]
* link:#gikvf[Instance Root Directory]
* link:#giiak[The `domain.xml` File]

[[gikqf]][[GSESG00054]][[installation-root-directory]]

==== Installation Root Directory

The installation root directory, represented as as-install, is the
parent of the directory that embedded {productName} uses for
configuration files. This directory corresponds to the base directory
for an installation of {productName}. Configuration files are
contained in the following directories in the base directory for an
installation of {productName}:

* `domains`
* `lib`

Specify the installation root directory only if you have a valid
nonembedded {productName} installation and are using
`glassfish-embedded-static-shell.jar`.

[[gikvf]][[GSESG00055]][[instance-root-directory]]

==== Instance Root Directory

The instance root directory, represented as domain-dir, is the parent
directory of a server instance directory. Embedded {productName} uses the server instance directory for domain
configuration files.

Specify the instance root directory only if you have a valid nonembedded
{productName} domain directory and are using
`glassfish-embedded-static-shell.jar`.


[NOTE]
====
If you have valid nonembedded {productName} as-install and domain-dir
directories, specify both in the `BootstrapProperties` and
`GlassFishProperties` classes respectively as described in
link:#gihyr[Creating and Configuring an Embedded {productName}].
====


If domain-dir is not specified, {productName} creates a directory
named ``gfembed``random-number``tmp`` in a temporary directory, where
random-number is a randomly generated 19-digit number. {productName}
then copies configuration files into this directory. The temporary
directory is the value of the system property `java.io.tmpdir`. You can
override this value by specifying the `glassfish.embedded.tmpdir`
property in the `GlassFishProperties` class or as a system property.

[[giiak]][[GSESG00056]][[the-domain.xml-file]]

==== The `domain.xml` File

Using an existing `domain.xml` file avoids the need to configure
embedded {productName} programmatically in your application. Your
application obtains domain configuration data from an existing
`domain.xml` file. You can create this file by using the administrative
interfaces of an installation of nonembedded {productName}. To
specify an existing `domain.xml` file, invoke the `setConfigFileURI`
method of the `GlassFishProperties` class as described in
link:#gihyr[Creating and Configuring an Embedded {productName}].


[NOTE]
====
The built-in `domain.xml` file used by default by Embedded {productName} can be downloaded from
`http://embedded-glassfish.java.net/domain.xml`. You can customize this
file and pass it in using the `setConfigFileURI` method while creating
an Embedded {productName}.
====


[[giijw]][[GSESG00037]][[including-the-glassfish-server-embedded-server-api-in-applications]]

=== Including the {productName} Embedded Server API in Applications

{productName} provides an application programming
interface (API) for developing applications in which {productName} is
embedded. For details, see the `org.glassfish.embeddable` packages at
`http://embedded-glassfish.java.net/nonav/apidocs/`.

The following topics are addressed here:

* link:#giide[Setting the Class Path]
* link:#giiky[Creating, Starting, and Stopping Embedded {productName}]
* link:#giigc[Deploying and Undeploying an Application in an Embedded
{productName}]
* link:#gjldy[Running `asadmin` Commands Using the {productName}
Embedded Server API]
* link:#gikrt[Sample Applications]

[[giide]][[GSESG00057]][[setting-the-class-path]]

==== Setting the Class Path

To enable your applications to locate the class libraries for embedded
{productName}, add one of the following JAR files to your class path:

`glassfish-embedded-nucleus.jar`::
  Corresponds to the nucleus distribution. Download this file from
  `http://download.java.net/maven/glassfish/org/glassfish/extras/glassfish-embedded-nucleus/`.
`glassfish-embedded-web.jar`::
  Contains classes needed for deploying Jakarta EE web applications.
  Download this file from
  `http://download.java.net/maven/glassfish/org/glassfish/extras/glassfish-embedded-web/`.
`glassfish-embedded-all.jar`::
  Contains classes needed for deploying all Jakarta EE application types.
  Download this file from
  `http://download.java.net/maven/glassfish/org/glassfish/extras/glassfish-embedded-all/`.
`glassfish-embedded-static-shell.jar`::
  Contains references to classes needed for deploying all Jakarta EE
  application types. Must be used with a nonembedded installation of
  {productName}. Reference this file from the
  as-install``/lib/embedded`` directory of a nonembedded {productName}
  installation. Do not move this file or it will not work. For an
  explanation of as-install, see link:#gikqf[Installation Root
  Directory].


[NOTE]
====
{productName} only supports use of the
`glassfish-embedded-static-shell.jar` file. The other files are part of
{productName} and are offered without official support.
====


In addition, add to the class path any other JAR files or classes upon
which your applications depend. For example, if an application uses a
database other than Java DB, include the Java DataBase Connectivity
(JDBC) driver JAR files in the class path.

[[giiky]][[GSESG00058]][[creating-starting-and-stopping-embedded-glassfish-server]]

==== Creating, Starting, and Stopping Embedded {productName}

Before you can run applications, you must set up and run the embedded
{productName}.

The following topics are addressed here:

* link:#gihyr[Creating and Configuring an Embedded {productName}]
* link:#gihyz[Running an Embedded {productName}]

[[gihyr]][[GSESG00043]][[creating-and-configuring-an-embedded-glassfish-server]]

===== Creating and Configuring an Embedded {productName}

To create and configure an embedded {productName}, perform these
tasks:

1. Instantiate the `org.glassfish.embeddable.BootstrapProperties`
class.
2. Invoke any methods for configuration settings that you require. This
is optional.
3. Invoke the `GlassFishRuntime.bootstrap()` or
`GlassFishRuntime.bootstrap(BootstrapProperties)` method to create a
`GlassFishRuntime` object.
4. Instantiate the `org.glassfish.embeddable.GlassFishProperties`
class.
5. Invoke any methods for configuration settings that you require. This
is optional.
6. Invoke the `glassfishRuntime.newGlassFish(GlassFishProperties)`
method to create a `GlassFish` object.

The methods of the `BootstrapProperties` class for setting the server
configuration are listed in the following table. The default value of
each configuration setting is also listed.

[[sthref4]][[gksir]]

Table 1-1 Methods of the `BootstrapProperties` Class

[width="100%",cols="<29%,<33%,<38%",options="header",]
|===
|Purpose |Method |Default Value
|References an existing link:#gikqf[Installation Root Directory], also called as-install
a|[source]
----
setInstallRoot(String as-install)
----

|None. If `glassfish-embedded-static-shell.jar` is used, the
link:#gikqf[Installation Root Directory] is automatically determined and
need not be specified.
|===


The methods of the `GlassFishProperties` class for setting the server
configuration are listed in the following table. The default value of
each configuration setting is also listed.

[[sthref5]][[gkskl]]

Table 1-2 Methods of the `GlassFishProperties` Class

[width="100%",cols="<24%,<37%,<39%",options="header",]
|===
|Purpose |Method |Default Value
|References an existing link:#gikvf[Instance Root Directory], also
called domain-dir
a|
[source]
----
setInstanceRoot(String domain-dir)
----

a|
In order of precedence:

* `glassfish.embedded.tmpdir` property value specified in `GlassFishProperties` object
* `glassfish.embedded.tmpdir` system property value
* `java.io.tmp` system property value
* as-install``/domains/domain1`` if a nonembedded installation is referenced

|Creates a new or references an existing configuration file
a|
[source]
----
setConfigFileURI(String configFileURI)
----
a|In order of precedence:

* domain-dir``/config/domain.xml`` if domain-dir was set using `setInstanceRoot`
* built-in embedded `domain.xml`

|Specifies whether the configuration file is read-only
a|
[source]
----
setConfigFileReadOnly(boolean readOnly)
----
|`true`

|Sets the port on which Embedded {productName} listens.
|`setPort`(String networkListener, int port)
|none
|===

[NOTE]
====
Do not use `setPort` if you are using `setInstanceRoot` or `setConfigFileURI`.
====


[[GSESG00005]][[gikmz]]
Example 1-1 Creating an Embedded {productName}

This example shows code for creating an Embedded {productName}.

[source,java]
----
...
import org.glassfish.embeddable.*;
...
    GlassFish glassfish = GlassFishRuntime.bootstrap().newGlassFish();
    glassfish.start();
...
----

[[GSESG00006]][[gksjo]]
Example 1-2 Creating an Embedded {productName} with configuration
customizations

This example shows code for creating an Embedded {productName} using
the existing domain-dir
`C:\samples\test\applicationserver\domains\domain1`.

[source,java]
----
// ...
import org.glassfish.embeddable.*;
    // ...
    BootstrapProperties bootstrapProperties = new BootstrapProperties();
    bootstrapProperties.setInstallRoot("C:\\samples\\test\\applicationserver");
    GlassFishRuntime glassfishRuntime = GlassFishRuntime.bootstrap(bootstrapProperties);

    GlassFishProperties glassfishProperties = new GlassFishProperties();
    glassfishProperties.setInstanceRoot("C:\\samples\\test\\applicationserver\\domains\\domain1");
    GlassFish glassfish = glassfishRuntime.newGlassFish(glassfishProperties);

    glassfish.start();
    // ...
----

[[gihyz]][[GSESG00044]][[running-an-embedded-glassfish-server]]

===== Running an Embedded {productName}

After you create an embedded {productName} as described in
link:#gihyr[Creating and Configuring an Embedded {productName}], you
can perform operations such as:

* link:#gjkxx[Setting the Port of an Embedded {productName} From an Application]
* link:#gihzg[Starting an Embedded {productName} From an Application]
* link:#gihzy[Stopping an Embedded {productName} From an Application]

[[gjkxx]][[GSESG00002]][[setting-the-port-of-an-embedded-glassfish-server-from-an-application]]

Setting the Port of an Embedded {productName} From an Application

You must set the server's HTTP or HTTPS port. If you do not set the
port, your application fails to start and throws an exception. You can
set the port directly or indirectly.

[NOTE]
====
Do not use `setPort` if you are using `setInstanceRoot` or
`setConfigFileURI`. These methods set the port indirectly.
====


* To set the port directly, invoke the `setPort` method of the
`GlassFishProperties` object.
* To set the port indirectly, use a `domain.xml` file that sets the
port. For more information, see link:#giiak[The `domain.xml` File].

[[GSESG00007]][[gjkxc]]
Example 1-3 Setting the port of an Embedded {productName}

This example shows code for setting the port of an embedded {productName}.

[source,java]
----
...
import org.glassfish.embeddable.*;
...
    GlassFishProperties glassfishProperties = new GlassFishProperties();
    glassfishProperties.setPort("http-listener", 8080);
    glassfishProperties.setPort("https-listener", 8181);
...
----

[[gihzg]][[GSESG00003]][[starting-an-embedded-glassfish-server-from-an-application]]

Starting an Embedded {productName} From an Application

To start an embedded {productName}, invoke the `start` method of the
`GlassFish` object.

[[GSESG00008]][[gilry]]
Example 1-4 Starting an Embedded {productName}

This example shows code for setting the port and starting an embedded
{productName}. This example also includes the code from
link:#gikmz[Example 1-1] for creating a `GlassFish` object.

[source,java]
----
...
import org.glassfish.embeddable.*;
...
    GlassFishProperties glassfishProperties = new GlassFishProperties();
    glassfishProperties.setPort("http-listener", 8080);
    glassfishProperties.setPort("https-listener", 8181);
    ...
    GlassFish glassfish = GlassFishRuntime.bootstrap().newGlassFish(glassfishProperties);
    glassfish.start();
...
----

[[gihzy]][[GSESG00004]][[stopping-an-embedded-glassfish-server-from-an-application]]

Stopping an Embedded {productName} From an Application

The API for embedded {productName} provides a method for stopping an
embedded server. Using this method enables your application to stop the
server in an orderly fashion by performing any necessary cleanup steps
before stopping the server, for example:

* Undeploying deployed applications
* Releasing any resources that your application uses

To stop an embedded {productName}, invoke the `stop` method of an
existing `GlassFish` object.

[[GSESG00009]][[gilnz]]
Example 1-5 Stopping an Embedded {productName}

This example shows code for prompting the user to press the Enter key to
stop an embedded {productName}. Code for creating a `GlassFish`
object is not shown in this example. For an example of code for creating
a `GlassFish` object, see link:#gikmz[Example 1-1].

[source,java]
----
...
import java.io.BufferedReader;
...
import org.glassfish.embeddable.*;
...
    System.out.println("Press Enter to stop server");
        // wait for Enter
    glassfish.stop(); // Stop Embedded GlassFish
...
----

As an alternative, you can use the `dispose` method to stop an embedded
{productName} and dispose of the temporary file system.

[[giigc]][[GSESG00059]][[deploying-and-undeploying-an-application-in-an-embedded-glassfish-server]]

==== Deploying and Undeploying an Application in an Embedded {productName}

Deploying an application installs the files that comprise the
application into Embedded {productName} and makes the application
ready to run. By default, an application is enabled when it is deployed.

The following topics are addressed here:

* link:#gilrf[To Deploy an Application From an Archive File or a Directory]
* link:#gilpm[Undeploying an Application]
* link:#gjrcs[Creating a Scattered Archive]
* link:#gkvgc[Creating a Scattered Enterprise Archive]

For general information about deploying applications in {productName}, see the link:application-deployment-guide.html#GSDPG[{productName}
Application Deployment Guide].

[[gilrf]][[GSESG00021]][[to-deploy-an-application-from-an-archive-file-or-a-directory]]

===== To Deploy an Application From an Archive File or a Directory

An archive file contains the resources, deployment descriptor, and
classes of an application. The content of the file must be organized in
the directory structure that the Jakarta EE specifications define for the
type of archive that the file contains. For more information, see
"link:application-deployment-guide/deploying-applications.html#GSDPG00004[Deploying Applications]" in {productName} Application Deployment Guide.

Deploying an application from a directory enables you to deploy an
application without the need to package the application in an archive
file. The contents of the directory must match the contents of the
expanded Jakarta EE archive file as laid out by the {productName}. The
directory must be accessible to the machine on which the deploying
application runs. For more information about the requirements for
deploying an application from a directory, see "link:application-deployment-guide/deploying-applications.html#GSDPG00043[To
Deploy an Application or Module in a Directory Format]" in {productName} Application Deployment Guide.

If some of the resources needed by an application are not under the
application's directory, see link:#gjrcs[Creating a Scattered Archive].

1. Instantiate the `java.io.File` class to represent the archive file or directory.

2. Invoke the `getDeployer` method of the `GlassFish` object to get an
instance of the `org.glassfish.embeddable.Deployer` class.

3. Invoke the `deploy(File archive, String... params)` method of the
instance of the `Deployer` object. +
Specify the `java.io.File` class instance you created previously as the
first method parameter. +
For information about optional parameters you can set, see the
descriptions of the
link:reference-manual/deploy.html#GSRFM00114[`deploy`(1)] subcommand parameters.
Simply quote each parameter in the method, for example `"--force=true"`.

[[GSESG00010]][[gioph]]
Example 1-6 Deploying an Application From an Archive File

This example shows code for deploying an application from the archive
file `c:\samples\simple.war` and setting the name, contextroot, and
force parameters. This example also includes the code from
link:#gikmz[Example 1-1] for creating `GlassFishProperties` and
`GlassFish` objects.

[source,java]
----
...
import java.io.File;
...
import org.glassfish.embeddable.*;
...
    GlassFishProperties glassfishProperties = new GlassFishProperties();
    glassfishProperties.setPort("http-listener", 8080);
    glassfishProperties.setPort("https-listener", 8181);
    ...
    GlassFish glassfish = GlassFishRuntime.bootstrap().newGlassFish(glassfishProperties);
    glassfish.start();
    File war = new File("c:\\samples\\simple.war");
    Deployer deployer = glassfish.getDeployer();
    deployer.deploy(war, "--name=simple", "--contextroot=simple", "--force=true");
    // deployer.deploy(war) can be invoked instead. Other parameters are optional.
...
----

[[gilpm]][[GSESG00045]][[undeploying-an-application]]

===== Undeploying an Application

Undeploy an application when the application is no longer required to
run in {productName}. For example, before stopping {productName},
undeploy all applications that are running in {productName}.


[NOTE]
====
If you reference a nonembedded {productName} installation using the
`glassfish-embedded-static-shell.jar` file and do not undeploy your
applications in the same server life cycle in which you deployed them,
expanded archives for these applications remain under the
domain-dir``/applications`` directory.
====


To undeploy an application, invoke the `undeploy` method of an existing
`Deployer` object. In the method invocation, pass the name of the
application as a parameter. This name is specified when the application
is deployed.

For information about optional parameters you can set, see the
descriptions of the
link:reference-manual/deploy.html#GSRFM00114[`deploy`(1)] command parameters.
Simply quote each parameter in the method, for example
`"--cascade=true"`.

To undeploy all deployed applications, invoke the `undeployAll` method
of an existing `EmbeddedDeployer` object. This method takes no
parameters.

[[GSESG00011]][[gilwu]]
Example 1-7 Undeploying an Application

This example shows code for undeploying the application that was
deployed in link:#gioph[Example 1-6].

[source,java]
----
...
import org.glassfish.embeddable.*;
...
    deployer.undeploy(war, "--droptables=true", "--cascade=true");
...
----

[[gjrcs]][[GSESG00046]][[creating-a-scattered-archive]]

===== Creating a Scattered Archive

Deploying a module from a scattered archive (WAR or JAR) enables you to
deploy an unpackaged module whose resources, deployment descriptor, and
classes are in any location. Deploying a module from a scattered archive
simplifies the testing of a module during development, especially if all
the items that the module requires are not available to be packaged.

In a scattered archive, these items are not required to be organized in
a specific directory structure. Therefore, you must specify the location
of the module's resources, deployment descriptor, and classes when
deploying the module.

To create a scattered archive, perform these tasks:

1. Instantiate the `org.glassfish.embeddable.archive.ScatteredArchive` class.
2. Invoke the `addClassPath` and `addMetadata` methods if you require them.
3. Invoke the `toURI` method to deploy the scattered archive.

The methods of this class for setting the scattered archive
configuration are listed in the following table. The default value of
each configuration setting is also listed.

[[sthref6]][[gjrdg]]

Table 1-3 Constructors and Methods of the `ScatteredArchive` Class

[width="100%",cols="<52%,<38%,<10%",options="header",]
|===
|Purpose |Method |Default Value
|Creates and names a scattered archive
a|[source,java]
----
ScatteredArchive(String name, ScatteredArchive.Type type)
----

|None

|Creates and names a scattered archive based on a top-level directory.
If the entire module is organized under the topDir, this is the only
method necessary. The topDir can be null if other methods specify the
remaining parts of the module.
a|[source,java]
----
ScatteredArchive(String name, ScatteredArchive.Type type, File topDir)
----

|None

|Adds a directory to the classes classpath
a|[source,java]
----
addClassPath(File path)
----

|None

|Adds a metadata locator
a|[source,java]
----
addMetaData(File path)
----

|None

|Adds and names a metadata locator
a|[source,java]
----
addMetaData(File path, String name)
----

|None

|Gets the deployable URI for this scattered archive a|
[source,java]
----
toURI()
----

|None
|===


[[GSESG00012]][[gjrfq]]
Example 1-8 Deploying an Application From a Scattered Archive

This example shows code for creating a WAR file and using the
`addClassPath` and `addMetadata` methods. This example also includes the
code from link:#gioph[Example 1-6] for deploying an application from an
archive file.

[source,java]
----
...
import java.io.File;
...
import org.glassfish.embeddable.*;
...
    GlassFishProperties glassfishProperties = new GlassFishProperties();
    glassfishProperties.setPort("http-listener", 9090);
    GlassFish glassfish = GlassFishRuntime.bootstrap().newGlassFish(glassfishProperties);
    glassfish.start();
    Deployer deployer = glassfish.getDeployer();
    ScatteredArchive archive = new ScatteredArchive("testapp", ScatteredArchive.Type.WAR);
    // target/classes directory contains complied servlets
    archive.addClassPath(new File("target", "classes"));
    // resources/sun-web.xml is the WEB-INF/sun-web.xml
    archive.addMetadata(new File("resources", "sun-web.xml"));
    // resources/web.xml is the WEB-INF/web.xml
    archive.addMetadata(new File("resources", "web.xml"));
    // Deploy the scattered web archive.
    String appName = deployer.deploy(archive.toURI(), "--contextroot=hello");

    deployer.undeploy(appName);
    glassfish.stop();
    glassfish.dispose();
...
----

[[gkvgc]][[GSESG00047]][[creating-a-scattered-enterprise-archive]]

===== Creating a Scattered Enterprise Archive

Deploying an application from a scattered enterprise archive (EAR)
enables you to deploy an unpackaged application whose resources,
deployment descriptor, and classes are in any location. Deploying an
application from a scattered archive simplifies the testing of an
application during development, especially if all the items that the
application requires are not available to be packaged.

In a scattered archive, these items are not required to be organized in
a specific directory structure. Therefore, you must specify the location
of the application's resources, deployment descriptor, and classes when
deploying the application.

To create a scattered enterprise archive, perform these tasks:

1. Instantiate the
`org.glassfish.embeddable.archive.ScatteredEnterpriseArchive` class.
2. Invoke the `addArchive` and `addMetadata` methods if you require
them.
3. Invoke the `toURI` method to deploy the scattered enterprise
archive.

The methods of this class for setting the scattered enterprise archive
configuration are listed in the following table. The default value of
each configuration setting is also listed.

[[sthref7]][[gkvgb]]

Table 1-4 Constructors and Methods of the `ScatteredEnterpriseArchive`
Class

[width="99%",cols="<42%,<48%,<10%",options="header",]
|===
|Purpose |Method |Default Value
|Creates and names a scattered enterprise archive a|
[source,java]
----
ScatteredEnterpriseArchive(String name)
----

 |None
|Adds a module or library a|
[source,java]
----
addArchive(File archive)
----

 |None
|Adds a module or library a|
[source,java]
----
addArchive(File archive, String name)
----

 |None
|Adds a module or library a|
[source,java]
----
addArchive(URI URI)
----

 |None
|Adds a module or library a|
[source,java]
----
addArchive(URI URI, String name)
----

 |None
|Adds a metadata locator a|
[source,java]
----
addMetaData(File path)
----

 |None
|Adds and names a metadata locator a|
[source,java]
----
addMetaData(File path, String name)
----

 |None
|Gets the deployable URI for this scattered archive a|
[source,java]
----
toURI()
----

 |None
|===


[[GSESG00013]][[gkvga]]
Example 1-9 Deploying an Application From a Scattered Enterprise Archive

This example shows code for creating an EAR file and using the
`addArchive` and `addMetadata` methods. This example also includes code
similar tolink:#gjrfq[Example 1-8] for creating a scattered archive.

[source,java]
----
...
import java.io.File;
...
import org.glassfish.embeddable.*;
...
    GlassFishProperties glassfishProperties = new GlassFishProperties();
    glassfishProperties.setPort("http-listener", 9090);
    GlassFish glassfish = GlassFishRuntime.bootstrap().newGlassFish(glassfishProperties);
    glassfish.start();
    Deployer deployer = glassfish.getDeployer();

    // Create a scattered web application.
    ScatteredArchive webmodule = new ScatteredArchive("testweb", ScatteredArchive.Type.WAR);
    // target/classes directory contains my complied servlets
    webmodule.addClassPath(new File("target", "classes"));
    // resources/sun-web.xml is my WEB-INF/sun-web.xml
    webmodule.addMetadata(new File("resources", "sun-web.xml"));

    // Create a scattered enterprise archive.
    ScatteredEnterpriseArchive archive = new ScatteredEnterpriseArchive("testapp");
    // src/application.xml is my META-INF/application.xml
    archive.addMetadata(new File("src", "application.xml"));
    // Add scattered web module to the scattered enterprise archive.
    // src/application.xml references Web module as "scattered.war".
    //Hence specify the name while adding the archive.
    archive.addArchive(webmodule.toURI(), "scattered.war");
    // lib/mylibrary.jar is a library JAR file.
    archive.addArchive(new File("lib", "mylibrary.jar"));
    // target/ejbclasses contain my compiled EJB module.
    // src/application.xml references EJB module as "ejb.jar".
    //Hence specify the name while adding the archive.
    archive.addArchive(new File("target", "ejbclasses"), "ejb.jar");

    // Deploy the scattered enterprise archive.
    String appName = deployer.deploy(archive.toURI());

    deployer.undeploy(appName);
    glassfish.stop();
    glassfish.dispose();
...
----

[[gjldy]][[GSESG00060]][[running-asadmin-commands-using-the-glassfish-server-embedded-server-api]]

Running `asadmin` Commands Using the {productName} Embedded Server
==== API

Running link:reference-manual/asadmin.html#GSRFM00263[`asadmin`] commands from an application enables
the application to configure the embedded {productName} to suit the
application's requirements. For example, an application can run the
required `asadmin` commands to create a JDBC technology connection to a
database.

For more information about configuring embedded {productName}, see
the link:administration-guide.html#GSADG[{productName} Administration
Guide]. For detailed information about `asadmin` commands, see Section 1
of the link:reference-manual.html#GSRFM[{productName} Reference
Manual].


[NOTE]
====
Ensure that your application has started an embedded {productName}
before the application attempts to run `asadmin` commands. For more
information, see link:#gihyz[Running an Embedded {productName}].
====


The `org.glassfish.embeddable` package contains classes that you can use
to run `asadmin` commands. Use the following code examples as templates
and change the command name, parameter names, and parameter values as
needed.

[[GSESG00014]][[gjldj]]
Example 1-10 Running an `asadmin create-jdbc-resource` Command

This example shows code for running an `asadmin create-jdbc-resource`
command. Code for creating and starting the server is not shown in this
example. For an example of code for creating and starting the server,
see link:#gilry[Example 1-4].

[source,java]
----
...
import org.glassfish.embeddable.*;
...
    String command = "create-jdbc-resource";
    String poolid = "--connectionpoolid=DerbyPool";
    String dbname = "jdbc/DerbyPool";
    CommandRunner commandRunner = glassfish.getCommandRunner();
    CommandResult commandResult = commandRunner.run(command, poolid, dbname);
...
----

[[GSESG00015]][[gjlfm]]
Example 1-11 Running an `asadmin set-log-level` Command

This example shows code for running an `asadmin set-log-level` command.
Code for creating and starting the server is not shown in this example.
For an example of code for creating and starting the server, see
link:#gilry[Example 1-4].

[source,java]
----
...
import org.glassfish.embeddable.*;
...
    String command = "set-log-level";
    String weblevel = "jakarta.enterprise.system.container.web=FINE";
    CommandRunner commandRunner = glassfish.getCommandRunner();
    CommandResult commandResult = commandRunner.run(command, weblevel);
...
----

For another way to change log levels, see link:#gjlfe[Changing Log
Levels in Embedded {productName}].

[[gikrt]][[GSESG00061]][[sample-applications]]

==== Sample Applications

[[GSESG00016]][[gionq]]
Example 1-12 Using an Existing `domain.xml` File and Deploying an
Application From an Archive File

This example shows code for the following:

* Using the existing file
`c:\myapp\embeddedserver\domains\domain1\config\domain.xml` and
preserving this file when the application is stopped.
* Deploying an application from the archive file
`c:\samples\simple.war`.

[source,java]
----
import java.io.File;
import java.io.BufferedReader;
import org.glassfish.embeddable.*;

public class Main {

     /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        File configFile = new File ("c:\\myapp\\embeddedserver\\domains\\domain1\\config\\domain.xml");
        File war = new File("c:\\samples\\simple.war");
        try {
            GlassFishRuntime glassfishRuntime = GlassFishRuntime.bootstrap();
            ...
            GlassFishProperties glassfishProperties = new GlassFishProperties();
            glassfishProperties.setConfigFileURI(configFile.toURI());
            glassfishProperties.setConfigFileReadOnly(false);
            ...
            GlassFish glassfish = glassfishRuntime.newGlassFish(glassfishProperties);
            glassfish.start();

            Deployer deployer = glassfish.getDeployer();
            deployer.deploy(war, "--force=true");
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("Press Enter to stop server");
        // wait for Enter
        new BufferedReader(new java.io.InputStreamReader(System.in)).readLine();
        try {
            glassfish.dispose();
            glassfishRuntime.shutdown();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}
----

[[gijhs]][[GSESG00038]][[testing-applications-with-the-maven-plug-in-for-embedded-glassfish-server]]

=== Testing Applications with the Maven Plug-in for Embedded {productName}

If you are using http://maven.apache.org/[Apache Maven]
(`http://maven.apache.org/`), the plug-in for embedded {productName}
simplifies the testing of applications. This plug-in enables you to
build and start an unpackaged application with a single Maven goal.

The following topics are addressed here:

* link:#gihus[To Set Up Your Maven Environment]
* link:#giivt[To Build and Start an Application From Maven]
* link:#gijly[To Stop Embedded {productName}]
* link:#gijjn[To Redeploy an Application That Was Built and Started From Maven]
* link:#gjkps[Maven Goals for Embedded {productName}]

Predefined Maven goals for embedded {productName} are described in
link:#gjkps[Maven Goals for Embedded {productName}].

To use Maven with Embedded {productName} and the EJB 3.1 Embeddable
API, see link:#gjxff[Using Maven with the EJB 3.1 Embeddable API and
Embedded {productName}].

[[gihus]][[GSESG00022]][[to-set-up-your-maven-environment]]

==== To Set Up Your Maven Environment

Setting up your Maven environment enables Maven to download the required
embedded {productName} distribution file when you build your project.
Setting up your Maven environment also identifies the plug-in that
enables you to build and start an unpackaged application with a single
Maven goal.

[[sthref8]]

Before You Begin

Ensure that http://maven.apache.org/[Apache Maven]
(`http://maven.apache.org/`) is installed.

1. Identify the Maven plug-in for embedded {productName}.
+
Add the following `plugin` element to your POM file:
+
[source,xml]
----
...
        ...
        <plugins>
            ...
            <plugin>
                <groupId>org.glassfish</groupId>
                <artifactId>maven-embedded-glassfish-plugin</artifactId>
                <version>version</version>
            </plugin>
            ...
        </plugins>
...
----
version::
  The version to use. The version of the final promoted build for this
  release is `3.1.1`. The Maven plug-in is not bound to a specific version
  of {productName}. You can specify the version you want to use. If
  no version is specified, a default version is used.

2. Configure the `embedded-glassfish` goal prefix, the application
name, and other standard settings.
+
Add the following `configuration` element to your POM file:
+
[source,xml]
----
...
        <plugins>
            ...
            <plugin>
                ...
                <configuration>
                    <goalPrefix>embedded-glassfish</goalPrefix>
                    ...
                    <app>target/test.war</app>
                    <port>8080</port>
                    <contextRoot>test</contextRoot>
                    <autoDelete>true</autoDelete>
                    ...
                </configuration>
                ...
            </plugin>
            ...
        </plugins>
...
----
app::
  In the app parameter, substitute the archive file or directory for your
  application. The optional port, contextRoot, and autoDelete parameters
  show example values. For details, see link:#gjkps[Maven Goals for
  Embedded {productName}].

3. Perform advanced plug-in configuration. This step is optional.
Add the following `configuration` element to your POM file:
+
[source,xml]
----
...
        <plugins>
            ...
            <plugin>
                ...
                <configuration>
                    <goalPrefix>embedded-glassfish</goalPrefix>
                    <app>target/test.war</app>
                    <name>test</name>
                    <contextRoot>test</contextRoot>
                    <ports>
                        <http-listener>8080</http-listener>
                        <https-listener>8181</https-listener>
                    </ports>
                    <bootstrapProperties>
                        <property>test_key=test_value</property>
                    </bootstrapProperties>
                    <bootstrapPropertiesFile>bootstrap.properties</bootstrapPropertiesFile>
                    <glassfishProperties>
<property>embedded-glassfish-config.server.jms-service.jms-host.default_JMS_host.port=17676</property>
                    </glassfishProperties>
                    <glassfishPropertiesFile>glassfish.properties</glassfishPropertiesFile>
                    <systemProperties>
                        <property>ANTLR_USE_DIRECT_CLASS_LOADING=true</property>
                    </systemProperties>
                    <systemPropertiesFile>system.properties</systemPropertiesFile>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>start</goal>
                            <goal>deploy</goal>
                            <goal>undeploy</goal>
                            <goal>stop</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            ...
        </plugins>
...
----

4. Configure Maven goals.
Add `execution` elements to your POM file:
+
[source,xml]
----
...
        <plugins>
            ...
            <plugin>
                ...
                <executions>
                    <execution>
                        <phase>install</phase>
                        <goals>
                                <goal>goal</goal>
                        </goals>
                    </execution>
                </executions>
                ...
            </plugin>
            ...
        </plugins>
...
----
goal::
  The goal to use. See link:#gjkps[Maven Goals for Embedded {productName}].

5. Configure the repository.
Add the following `repository` element to your POM file:
+
[source,xml]
----
<pluginRepositories>
    <pluginRepository>
        <id>maven2-repository.dev.java.net</id>
        <name>Java.net Repository for Maven</name>
        <url>http://download.java.net/maven/glassfish/</url>
    </pluginRepository>
</pluginRepositories>
----

[[GSESG00017]][[gjkod]]
Example 1-13 POM File for Configuring Maven to Use Embedded {productName}

This example shows a POM file for configuring Maven to use embedded {productName}.

[source,xml]
----
<?xml version="1.0" encoding="UTF-8"?>
<!--
Line breaks in the following element are for readability purposes only
-->
<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">

  <modelVersion>4.0.0</modelVersion>
  <groupId>org.glassfish</groupId>
  <artifactId>maven-glassfish-plugin-tester</artifactId>
  <version>3.1</version>
  <name>Maven test</name>
  <build>
    <plugins>
      <plugin>
        <groupId>org.glassfish</groupId>
        <artifactId>maven-embedded-glassfish-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <goalPrefix>embedded-glassfish</goalPrefix>
          <app>target/test.war</app>
          <port>8080</port>
          <contextRoot>test</contextRoot>
          <autoDelete>true</autoDelete>
       </configuration>
       <executions>
          <execution>
             <phase>install</phase>
             <goals>
                   <goal>run</goal>
             </goals>
          </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
  <pluginRepositories>
      <pluginRepository>
          <id>maven2-repository.dev.java.net</id>
          <name>Java.net Repository for Maven</name>
          <url>http://download.java.net/maven/glassfish/</url>
      </pluginRepository>
  </pluginRepositories>
</project>
----

[[giivt]][[GSESG00023]][[to-build-and-start-an-application-from-maven]]

==== To Build and Start an Application From Maven

If you are using Maven to manage the development of your application,
you can use a Maven goal to build and start the application in embedded
{productName}.

[[sthref9]]

Before You Begin

Ensure that your Maven environment is configured, as described in
link:#gihus[To Set Up Your Maven Environment].

1. Include the path to the Maven executable file `mvn` in your path
statement.
2. Ensure that the `JAVA_HOME` environment variable is defined.
3. Create a directory for the Maven project for your application.
4. Copy to your project directory the POM file that you created in
link:#gihus[To Set Up Your Maven Environment].
5. Run the following command in your project directory:
+
[source]
----
mvn install
----
This command performs the following actions:
* Installs the Maven repository in a directory named `.m2` under your
home directory.
* Starts Embedded {productName}.
* Deploys your application.
+
The application continues to run in Embedded {productName} until
Embedded {productName} is stopped.

[[gijly]][[GSESG00024]][[to-stop-embedded-glassfish-server]]

==== To Stop Embedded {productName}

1. Change to the root directory of the Maven project for your
application.
2. Run the Maven goal to stop the application in embedded {productName}.
+
[source]
----
mvn embedded-glassfish:stop
----
This runs the `stop` method of the `GlassFish` object and any other
methods that are required to shut down the server in an orderly fashion.
See link:#gihzy[Stopping an Embedded {productName} From an
Application].

[[gijjn]][[GSESG00025]][[to-redeploy-an-application-that-was-built-and-started-from-maven]]

==== To Redeploy an Application That Was Built and Started From Maven

An application that was built and started from Maven continues to run in
Embedded {productName} until Embedded {productName} is stopped.
While the application is running, you can test changes to the
application by redeploying it.

To redeploy, in the window from where the application was built and
started from Maven, press Enter.

[[gjkps]][[GSESG00062]][[maven-goals-for-embedded-glassfish-server]]

==== Maven Goals for Embedded {productName}

You can use the following Maven goals to test your applications with
embedded {productName}:

* link:#gjkxo[`embedded-glassfish:run` Goal]
* link:#gjkwy[`embedded-glassfish:start` Goal]
* link:#gjkvc[`embedded-glassfish:deploy` Goal]
* link:#gjkvg[`embedded-glassfish:undeploy` Goal]
* link:#gjkyl[`embedded-glassfish:stop` Goal]
* link:#gjkxq[`embedded-glassfish:admin` Goal]

[[gjkxo]][[GSESG00048]][[embedded-glassfishrun-goal]]

===== `embedded-glassfish:run` Goal

This goal starts the server and deploys an application. You can redeploy
if you change the application. The application can be a packaged archive
or a directory that contains an exploded application. You can set the
parameters described in the following table.

[[sthref10]][[gjkws]]

Table 1-5 `embedded-glassfish:run` Parameters

[width="100%",cols="<18%,<42%,<40%",options="header",]
|===
|Parameter |Default |Description
|app |None |The archive file or directory for the application to be deployed.

|serverID |`maven` |(optional) The ID of the server to start.

|containerType |`all` |(optional) The container to start: `web`, `ejb`, `jpa`, or `all`.

|installRoot |None |(optional) The link:#gikqf[Installation Root Directory].

|instanceRoot a|
In order of precedence:

* `glassfish.embedded.tmpdir` property value specified in `GlassFishProperties` object
* `glassfish.embedded.tmpdir` system property value
* `java.io.tmp` system property value
* as-install``/domains/domain1`` if a nonembedded installation is referenced

 |(optional) The link:#gikvf[Instance Root Directory]

|configFile |domain-dir``/config/domain.xml`` |(optional) The
configuration file.

|port |None. Must be set explicitly or defined in the configuration
file. |The HTTP or HTTPS port.

|name a|
In order of precedence:

* The `application-name` or `module-name` in the deployment descriptor.
* The name of the archive file without the extension or the directory name.

For more information, see "link:application-deployment-guide/overview.html#GSDPG00323[Naming Standards]" in
{productName} Application Deployment Guide.

 |(optional) The name of the application.

|contextRoot |The name of the application. |(optional) The context root
of the application.

|precompileJsp |`false` |(optional) If `true`, JSP pages are precompiled
during deployment.

|dbVendorName |None |(optional) The name of the database vendor for
which tables can be created. Allowed values are `javadb`, `db2`,
`mssql`, `mysql`, `oracle`, `postgresql`, `pointbase`, `derby` (also for
CloudScape), and `sybase`, case-insensitive.

|createTables |Value of the `create-tables-at-deploy` attribute in
`sun-ejb-jar.xml`. |(optional) If `true`, creates database tables during
deployment for beans that are automatically mapped by the EJB container.

|dropTables |Value of the `drop-tables-at-undeploy` attribute in
`sun-ejb-jar.xml`. a|
(optional) If `true`, and deployment and undeployment occur in the same
JVM session, database tables that were automatically created when the
bean(s) were deployed are dropped when the bean(s) are undeployed.

If `true`, the name parameter must be specified or tables may not be
dropped.

|autoDelete |`false` a|
(optional) If `true`, deletes the contents of the link:#gikvf[Instance
Root Directory] when the server is stopped.

Caution: Do not set `autoDelete` to `true` if you are using
`installRoot` to refer to a preexisting {productName} installation.

|===


[[gjkwy]][[GSESG00049]][[embedded-glassfishstart-goal]]

===== `embedded-glassfish:start` Goal

This goal starts the server. You can set the parameters described in the
following table.

[[sthref11]][[gjkye]]

Table 1-6 `embedded-glassfish:start` Parameters

[width="100%",cols="<17%,<38%,<45%",options="header",]
|===
|Parameter |Default |Description
|serverID |`maven` |(optional) The ID of the server to start.

|containerType |`all` |(optional) The container to start: `web`, `ejb`,
`jpa`, or `all`.

|installRoot |None |(optional) The link:#gikqf[Installation Root
Directory].

|instanceRoot a|
In order of precedence:

* `glassfish.embedded.tmpdir` system property value
* `java.io.tmpdir` system property value
* as-install``/domains/domain1``

 |(optional) The link:#gikvf[Instance Root Directory]

|configFile |domain-dir`/config/domain.xml` |(optional) The
configuration file.

|port |None. Must be set explicitly or defined in the configuration
file. |The HTTP or HTTPS port.

|autoDelete |`false` a|
(optional) If `true`, deletes the contents of the link:#gikvf[Instance
Root Directory] when the server is stopped.

Caution: Do not set `autoDelete` to `true` if you are using
`installRoot` to refer to a preexisting {productName} installation.

|===


[[gjkvc]][[GSESG00050]][[embedded-glassfishdeploy-goal]]

===== `embedded-glassfish:deploy` Goal

This goal deploys an application. You can redeploy if you change the
application. The application can be a packaged archive or a directory
that contains an exploded application. You can set the parameters
described in the following table.

[[sthref12]][[gjkvv]]

Table 1-7 `embedded-glassfish:deploy` Parameters

[width="100%",cols="<18%,<39%,<43%",options="header",]
|===
|Parameter |Default |Description
|app |None |The archive file or directory for the application to be
deployed.

|serverID |`maven` |(optional) The ID of the server to start.

|name a|
In order of precedence:

* The `application-name` or `module-name` in the deployment descriptor.
* The name of the archive file without the extension or the directory
name.

For more information, see "link:application-deployment-guide/overview.html#GSDPG00323[Naming Standards]" in
{productName} Application Deployment Guide.

 |(optional) The name of the application.

|contextRoot |The name of the application. |(optional) The context root
of the application.

|precompileJsp |`false` |(optional) If `true`, JSP pages are precompiled
during deployment.

|dbVendorName |None |(optional) The name of the database vendor for
which tables can be created. Allowed values are `javadb`, `db2`,
`mssql`, `oracle`, `postgresql`, `pointbase`, `derby` (also for
CloudScape), and `sybase`, case-insensitive.

|createTables |Value of the `create-tables-at-deploy` attribute in
`sun-ejb-jar.xml`. |(optional) If `true`, creates database tables during
deployment for beans that are automatically mapped by the EJB container.
|===


[[gjkvg]][[GSESG00051]][[embedded-glassfishundeploy-goal]]

===== `embedded-glassfish:undeploy` Goal


[NOTE]
====
If you reference a nonembedded {productName} installation using the
`glassfish-embedded-static-shell.jar` file and do not undeploy your
applications in the same server life cycle in which you deployed them,
expanded archives for these applications remain under the
domain-dir``/applications`` directory.
====


This goal undeploys an application. You can set the parameters described
in the following table.

[[sthref13]][[gjkxf]]

Table 1-8 `embedded-glassfish:undeploy` Parameters

[width="100%",cols="<14%,<34%,<52%",options="header",]
|===
|Parameter |Default |Description
|name |If the name is omitted, all applications are undeployed. |The
name of the application.

|serverID |`maven` |(optional) The ID of the server to start.

|dropTables |Value of the `drop-tables-at-undeploy` attribute in
`sun-ejb-jar.xml`. a|
(optional) If `true`, and deployment and undeployment occur in the same
JVM session, database tables that were automatically created when the
bean(s) were deployed are dropped when the bean(s) are undeployed.

If `true`, the name parameter must be specified or tables may not be
dropped.

|cascade |`false` a|
(optional) If `true`, deletes all connection pools and connector
resources associated with the resource adapter being undeployed.

If `false`, undeployment fails if any pools or resources are still
associated with the resource adapter.

This attribute is applicable to connectors (resource adapters) and
applications with connector modules.

|===


[[gjkyl]][[GSESG00052]][[embedded-glassfishstop-goal]]

===== `embedded-glassfish:stop` Goal

This goal stops the server. You can set the parameters described in the
following table.

[[sthref14]][[gjkwm]]

Table 1-9 `embedded-glassfish:stop` Parameters

[width="100%",cols="<16%,<17%,<67%",options="header",]
|===
|Parameter |Default |Description
|serverID |`maven` |(optional) The ID of the server to stop.
|===


[[gjkxq]][[GSESG00053]][[embedded-glassfishadmin-goal]]

===== `embedded-glassfish:admin` Goal

This goal runs a {productName} administration command. You must use
either the command and commandParameters parameters in combination or
the commandLine parameter. For more information about administration
commands, see the link:reference-manual.html#GSRFM[{productName}
Reference Manual]. You can set the parameters described in the following
table.

[[sthref15]][[gjkwe]]

Table 1-10 `embedded-glassfish:start` Parameters

[width="100%",cols="<24%,<10%,<66%",options="header",]
|===
|Parameter |Default |Description
|serverID |`maven` |(optional) The ID of the server on which to run the
command.

|command |None |The name of the command, for example
`createJdbcResource`.

|commandParameters |None |A map of the command parameters. See the
`org.glassfish.embeddable.admin.CommandParameters` class at
`http://glassfish.java.net/nonav/docs/v3/api/`.

|commandLine |None |The full `asadmin` syntax of the command.
|===


[[gjlde]][[GSESG00039]][[using-the-ejb-3.1-embeddable-api-with-embedded-glassfish-server]]

=== Using the EJB 3.1 Embeddable API with Embedded {productName}

The EJB 3.1 Embeddable API is designed for unit testing of EJB modules.
You must use this API with a pre-installed, nonembedded {productName}
instance. However, you can take advantage of Embedded {productName}'s
ease of use by referencing the nonembedded {productName} instance
with the `glassfish-embedded-static-shell.jar` file.

Embedded {productName} is not related to the EJB 3.1 Embeddable API,
but you can use these APIs together.

The Maven plug-in does not apply to embeddable EJB applications.
However, you can use Maven with the POM file shown in link:#gjxff[Using
Maven with the EJB 3.1 Embeddable API and Embedded {productName}].

The EJB 3.1 Embeddable API is described in
http://jcp.org/en/jsr/detail?id=318[Java Specification Request (JSR)
318] (`http://jcp.org/en/jsr/detail?id=318`). An `ejb-embedded` sample
is included in the samples available at
http://www.oracle.com/technetwork/java/javaee/downloads/index.html[Java
EE 7 Downloads]
(`http://www.oracle.com/technetwork/java/javaee/downloads/index.html`)
or
http://www.oracle.com/technetwork/java/javaee/documentation/index.html[Code
Samples]
(`http://www.oracle.com/technetwork/java/javaee/documentation/index.html`).

The EJB 3.1 Embeddable API supports all EJB 3.1 Lite features with
addition of the EJB timer service and testing of EJB modules packaged in
a WAR file.

For EJB modules in a WAR file (or an exploded directory), if a web
application has one EJB module, and there are no other EJB modules in
the classpath, those entries (libraries) are ignored. If there are other
EJB modules, a temporary EAR file is created. For EJB modules in a WAR
file to be tested, the client code must use EJB modules with interfaces
or without annotations. Those EJB modules are not part of the classpath
and can't be loaded by the client class loader.

The following topics are addressed here:

* link:#gjlcr[To Use the EJB 3.1 Embeddable API with Embedded {productName}]
* link:#gksnv[EJB 3.1 Embeddable API Properties]
* link:#gjxff[Using Maven with the EJB 3.1 Embeddable API and Embedded
{productName}]

[[gjlcr]][[GSESG00026]][[to-use-the-ejb-3.1-embeddable-api-with-embedded-glassfish-server]]

==== To Use the EJB 3.1 Embeddable API with Embedded {productName}

1. To specify {productName} as the Container Provider, include
`glassfish-embedded-static-shell.jar` or `glassfish-embedded-all.jar` in
the class path of your embeddable EJB application.
+
Reference the `glassfish-embedded-static-shell.jar` file from the
as-install``/lib/embedded`` directory of a {productName} installation.
Do not move this file or it will not work.
+
See link:#giide[Setting the Class Path] and Section 22.3.3 of the EJB
3.1 Specification, Embeddable Container Bootstrapping.
2. Configure any required resources.
+
For more information about configuring resources, see the Administration
Console Online Help or "link:administration-guide.html#GSADG00298[Resources and Services
Administration]" in {productName} Administration
Guide. The `jdbc/__default` Java DB database is preconfigured with all
distributions of {productName}. However, if you are using
`glassfish-embedded-static-shell.jar`, you must start the database
manually.
+
If your embeddable EJB application uses Java Persistence, you do not
need to specify a JDBC resource. See link:#gksmw[Default Java
Persistence Data Source for Embedded {productName}].
3. Invoke one of the `createEJBContainer` methods.
+

[NOTE]
====
Do not deploy your embeddable EJB application or any of its dependent
Jakarta EE modules before invoking one of the `createEJBContainer` methods.
These methods perform deployment in the background and do not load
previously deployed applications or modules.
====

4. To change the link:#gikvf[Instance Root Directory], set the
`org.glassfish.ejb.embedded.glassfish.instance.root` system property
value by using the `createEJBContainer``(Map<?, ?> properties)` method.
+
The default link:#gikvf[Instance Root Directory] location is
as-install``/domains/domain1`` if a nonembedded installation is
referenced. This system property applies only to embeddable EJB
applications used with nonembedded {productName}.
5. Close the EJB container properly to release all acquired resources
and threads.

[[gksnv]][[GSESG00063]][[ejb-3.1-embeddable-api-properties]]

==== EJB 3.1 Embeddable API Properties

Properties that can be passed to the
`EJBContainer#createEJBContainer(Properties)` method are summarized in
the following table. All properties are in the
`org.glassfish.ejb.embedded.glassfish` package. For example, the full
name of the `installation.root` property is
`org.glassfish.ejb.embedded.glassfish.installation.root`.

[[sthref16]][[gksop]]

Table 1-11 EJB 3.1 Embeddable API Properties

[width="100%",cols="<30%,<39%,<31%",options="header",]
|===
|Property |Default |Description
|`installation.root` |{productName} installation location from which
`glassfish-embedded-static-shell.jar` is referenced |The
link:#gikqf[Installation Root Directory].

|`instance.root` a|
In order of precedence:

* `glassfish.embedded.tmpdir` property value specified in
`GlassFishProperties` object
* `glassfish.embedded.tmpdir` system property value
* `java.io.tmp` system property value
* as-install``/domains/domain1`` if a nonembedded installation is referenced

 |The link:#gikvf[Instance Root Directory].

|`configuration.file` |domain-dir`/config/domain.xml` |The configuration
file.

|`keep-temporary-files` |`false` |If `true`, keeps temporary files
(exploded EAR file and configuration file) created by the embedded EJB
container when Embedded {productName} is stopped.

|`web.http.port` |None |Enables the web container if set. Needed for
testing web services in a WAR file. The value is ignored and can be an
empty string.

|`instance.reuse` |`false` |If `true`, no changes are made to the
existing configuration file, and a temporary server instance is not
created for the embedded run. Instead, execution happens against the
existing server instance. Do not use this option if the reused server
instance could be in use by the running nonembedded {productName}.

|`skip-client-modules` |`false` |If `true`, omits modules from the
classpath if they are not specified using `EJBContainer.MODULES` and
have a manifest file with a `Main-Class` attribute.
|===


[[gjxff]][[GSESG00064]][[using-maven-with-the-ejb-3.1-embeddable-api-and-embedded-glassfish-server]]

==== Using Maven with the EJB 3.1 Embeddable API and Embedded {productName}

When using Maven with the EJB 3.1 Embeddable API and Embedded {productName}, you cannot use the features of the Maven plug-in. You must start
and stop Embedded {productName} manually or programmatically outside
of Maven.

[[GSESG00018]][[gjxds]]
Example 1-14 Maven POM File for Using the EJB 3.1 Embeddable API with
Embedded {productName}

This example shows a POM file for configuring Maven to use the EJB 3.1
Embeddable API with Embedded {productName}.

[source,xml]
----
<!--
Line breaks in the following element are for readability purposes only
-->
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.glassfish</groupId>
    <artifactId>my-ejb-app-tester</artifactId>
    <version>3.1</version>
    <name>Maven test</name>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.extras</groupId>
            <artifactId>glassfish-embedded-static-shell</artifactId>
            <version>${project.version}</version>
            <scope>system</scope>
            <systemPath>
                ${env.S1AS_HOME}/lib/embedded/glassfish-embedded-static-shell.jar
            </systemPath>
        </dependency>
<!--
        The javaee-api is stripped of any code and is just used to compile your
        application. The scope provided in Maven means that it is used for compiling,
        but is also available when testing. For this reason, the javaee-api needs to
        be below the embedded Glassfish dependency. The javaee-api can actually be
        omitted when the embedded Glassfish dependency is included, but to keep your
        project Java-EE 6 rather than GlassFish 3, specification is important.
-->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <pluginRepositories>
        <pluginRepository>
            <id>maven2-repository.dev.java.net</id>
            <name>Java.net Repository for Maven</name>
            <url>http://download.java.net/maven/glassfish/</url>
        </pluginRepository>
    </pluginRepositories>
</project>
----

If you are using `glassfish-embedded-static-shell.jar`, you can omit the
`dependency` element with the `javaee-api` `artifactId` and the
`pluginRepositories` element.

Set the `S1AS_HOME` environment variable to the installation root
directory before running the `mvn clean verify` command.

[[gjlfe]][[GSESG00040]][[changing-log-levels-in-embedded-glassfish-server]]

=== Changing Log Levels in Embedded {productName}

To change log levels in Embedded {productName}, you can follow the
steps in this section or you can use the Embedded Server API as shown in
link:#gjlfm[Example 1-11]. For more information about {productName}
logging, see "link:administration-guide/logging.html#GSADG00010[Administering the Logging Service]" in
{productName} Administration Guide.

You can change log levels in Embedded {productName} in either of the
following ways:

* Using the {productName} Embedded Server API
* Creating a custom logging configuration file

Both these ways use logger names. For a list of logger names, use the
link:reference-manual/list-log-levels.html#GSRFM00183[`list-log-levels`] subcommand.

[[GSESG00019]][[gkrhh]]
Example 1-15 Using the {productName} Embedded Server API

This example shows how to set log levels using the `getLogger` method in
the API.

[source,java]
----
import org.glassfish.embeddable.*;

// Create Embedded GlassFish
GlassFish glassfish = GlassFishRuntime.bootstrap().newGlassFish();

// Set the log levels. For example, set 'deployment' and 'server' log levels to FINEST
Logger.getLogger("").getHandlers()[0].setLevel(Level.FINEST);
Logger.getLogger("jakarta.enterprise.system.tools.deployment").setLevel(Level.FINEST);
Logger.getLogger("jakarta.enterprise.system").setLevel(Level.FINEST);

// Start Embedded GlassFish and deploy an application.
// You will see all the FINEST logs printed on the console.
glassfish.start();
glassfish.getDeployer().deploy(new File("sample.war"));

// Dispose Embedded GlassFish
glassfish.dispose();
----

[[GSESG00020]][[gkrgw]]
Example 1-16 Creating a Custom Logging Configuration File

This example shows the contents of a custom logging configuration file,
`customlogging.properties`.

[source]
----
handlers= java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level = FINEST
jakarta.enterprise.system.tools.deployment.level = FINEST
jakarta.enterprise.system.level = FINEST
----

Pass the name of this custom logging configuration file to the `java`
command when you invoke Embedded {productName}. For example:

[source]
----
java -Djava.util.logging.config.file=customlogging.properties MyEmbeddedGlassFish
----

[[gksmw]][[GSESG00041]][[default-java-persistence-data-source-for-embedded-glassfish-server]]

=== Default Java Persistence Data Source for Embedded {productName}

The `jdbc/__default` Java DB database is preconfigured with Embedded
{productName}. It is used when an application is deployed in Embedded
{productName} that uses Java Persistence but doesn't specify a data
source. Embedded {productName} uses the embedded Java DB database
created in a temporary domain that is destroyed when Embedded {productName} is stopped. You can use a Java DB database configured with
nonembedded {productName} if you explicitly specify the instance root
directory or the configuration file.

By default, weaving is enabled when the {productName} Embedded Server
API is used. To disable weaving, set the
`org.glassfish.persistence.embedded.weaving.enabled` property to
`false`.

[[gihxf]][[GSESG00042]][[restrictions-for-embedded-glassfish-server]]

=== Restrictions for Embedded {productName}

The `glassfish-embedded-web.jar` file for embedded {productName}
supports only these features of nonembedded {productName}:

* The following web technologies of the Jakarta EE platform:

** Java Servlet API

** JavaServer Pages (JSP) technology

** JavaServer Faces technology
* JDBC-technology connection pooling
* Java Persistence API
* Java Transaction API
* Java Transaction Service

The `glassfish-embedded-all.jar` and
`glassfish-embedded-static-shell.jar` files support all features of
nonembedded {productName} with these exceptions:

* Installers
* Administration Console
* Update Tool
* Apache Felix OSGi framework
* The Maven plug-in for embedded {productName} does not support
application clients.
* Applications that require ports for communication, such as remote EJB
components, do not work with the EJB 3.1 Embeddable API running with
embedded {productName} if a nonembedded {productName} is running
in parallel.

Embedded {productName} requires no installation or configuration. As
a result, the following files and directories are absent from the file
system until embedded {productName} is started:

* `default-web.xml` file
* `domain.xml` file
* Applications directory
* Instance root directory

When embedded {productName} is started, the base installation
directory that {productName} uses depends on the options with which
{productName} is started. If necessary, embedded {productName}
creates a base installation directory. Embedded {productName} then
copies the following directories and their contents from the Java
archive (JAR) file in which embedded {productName} is distributed:

* `domains`
* `lib`

If necessary, {productName} also creates an instance root directory.
