type=page
status=published
title=Eclipse GlassFish Server 5.1 Embedded Server Guide
prev=preface.html
~~~~~~
Eclipse GlassFish Server 5.1 Embedded Server Guide
==================================================

[[GSESG00001]][[gjldt]]


[[glassfish-server-open-source-edition-4.0-embedded-server-guide]]
1 Eclipse GlassFish Server 5.1 Embedded Server Guide
----------------------------------------------------

This document explains how to run applications in embedded GlassFish
Server Open Source Edition and to develop applications in which
GlassFish Server is embedded. This document is for software developers
who are developing applications to run in embedded GlassFish Server. The
ability to program in the Java language is assumed.

The following topics are addressed here:

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

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

Introduction to Embedded GlassFish Server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Embedded Eclipse GlassFish Server enables you to use
GlassFish Server as a library. Embedded GlassFish Server also enables
you to run GlassFish Server inside any Virtual Machine for the Java
platform (Java Virtual Machine or JVMmachine).

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


[width="100%",cols="<100%",]
|=======================================================================
a|
Note:

Embedded GlassFish Server does not run on the Java Platform, Micro
Edition (Java ME platform).

|=======================================================================


You can use embedded GlassFish Server in the following ways:

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

Embedded GlassFish Server 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 GlassFish Server on a single
system. Testing and debugging are simplified because the need for an
installed and configured GlassFish Server is eliminated. Therefore, you
can run unit tests automatically in every build.


[width="100%",cols="<100%",]
|=======================================================================
a|
Note:

For information on how to embed GlassFish Server in an OSGi environment,
see the link:../add-on-component-development-guide/toc.html#GSACG[GlassFish Server Open Source Edition Add-On
Component Development Guide].

|=======================================================================


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

Embedded GlassFish Server File System
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The following Embedded GlassFish Server directories and files are
important if you are referencing a nonembedded installation of GlassFish
Server:

* 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 GlassFish Server uses for
configuration files. This directory corresponds to the base directory
for an installation of GlassFish Server. Configuration files are
contained in the following directories in the base directory for an
installation of GlassFish Server:

* `domains`
* `lib`

Specify the installation root directory only if you have a valid
nonembedded GlassFish Server 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 GlassFish Server Open
Source Edition uses the server instance directory for domain
configuration files.

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


[width="100%",cols="<100%",]
|=======================================================================
a|
Note:

If you have valid nonembedded GlassFish Server 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 GlassFish Server].

|=======================================================================


If domain-dir is not specified, GlassFish Server creates a directory
named `gfembed`random-number`tmp` in a temporary directory, where
random-number is a randomly generated 19-digit number. GlassFish Server
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 GlassFish Server 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 GlassFish Server. 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 GlassFish Server].


[width="100%",cols="<100%",]
|=======================================================================
a|
Note:

The built-in `domain.xml` file used by default by Embedded GlassFish
Server 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 GlassFish Server.

|=======================================================================


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

Including the GlassFish Server Embedded Server API in Applications
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Eclipse GlassFish Server provides an application programming
interface (API) for developing applications in which GlassFish Server 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 GlassFish
Server]
* link:#giigc[Deploying and Undeploying an Application in an Embedded
GlassFish Server]
* link:#gjldy[Running `asadmin` Commands Using the GlassFish Server
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
GlassFish Server, 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 Java 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 Java 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 Java EE
  application types. Must be used with a nonembedded installation of
  GlassFish Server. Reference this file from the
  as-install`/lib/embedded` directory of a nonembedded GlassFish Server
  installation. Do not move this file or it will not work. For an
  explanation of as-install, see link:#gikqf[Installation Root
  Directory].


[width="100%",cols="<100%",]
|=======================================================================
a|
Note:

Oracle GlassFish Server only supports use of the
`glassfish-embedded-static-shell.jar` file. The other files are part of
Eclipse GlassFish Server 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 GlassFish Server
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Before you can run applications, you must set up and run the embedded
GlassFish Server.

The following topics are addressed here:

* link:#gihyr[Creating and Configuring an Embedded GlassFish Server]
* link:#gihyz[Running an Embedded GlassFish Server]

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

Creating and Configuring an Embedded GlassFish Server
+++++++++++++++++++++++++++++++++++++++++++++++++++++

To create and configure an embedded GlassFish Server, 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,oac_no_warn]
----
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,oac_no_warn]
----
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,oac_no_warn]
----
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,oac_no_warn]
----
setConfigFileReadOnly(boolean readOnly)
----

 |`true`

|Sets the port on which Embedded GlassFish Server listens.
|`setPort`(String networkListener, int port) |none
|=======================================================================



[width="100%",cols="<100%",]
|=======================================================================
a|
Note:

Do not use `setPort` if you are using `setInstanceRoot` or
`setConfigFileURI`.

|=======================================================================


[[GSESG00005]][[gikmz]]


Example 1-1 Creating an Embedded GlassFish Server

This example shows code for creating an Embedded GlassFish Server.

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

[[GSESG00006]][[gksjo]]


Example 1-2 Creating an Embedded GlassFish Server with configuration
customizations

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

[source,oac_no_warn]
----
...
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 GlassFish Server
++++++++++++++++++++++++++++++++++++

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

* link:#gjkxx[Setting the Port of an Embedded GlassFish Server From an
Application]
* link:#gihzg[Starting an Embedded GlassFish Server From an Application]
* link:#gihzy[Stopping an Embedded GlassFish Server From an Application]

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

Setting the Port of an Embedded GlassFish Server 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.


[width="100%",cols="<100%",]
|=======================================================================
a|
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 GlassFish Server

This example shows code for setting the port of an embedded GlassFish
Server.

[source,oac_no_warn]
----
...
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 GlassFish Server From an Application

To start an embedded GlassFish Server, invoke the `start` method of the
`GlassFish` object.

[[GSESG00008]][[gilry]]


Example 1-4 Starting an Embedded GlassFish Server

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

[source,oac_no_warn]
----
...
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 GlassFish Server From an Application

The API for embedded GlassFish Server 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 GlassFish Server, invoke the `stop` method of an
existing `GlassFish` object.

[[GSESG00009]][[gilnz]]


Example 1-5 Stopping an Embedded GlassFish Server

This example shows code for prompting the user to press the Enter key to
stop an embedded GlassFish Server. 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,oac_no_warn]
----
...
import java.io.BufferedReader;
...
import org.glassfish.embeddable.*;
...
    System.out.println("Press Enter to stop server");
        // wait for Enter
    glassfish.stop(); // Stop Embedded GlassFish Server
...
----

As an alternative, you can use the `dispose` method to stop an embedded
GlassFish Server 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 GlassFish Server
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Deploying an application installs the files that comprise the
application into Embedded GlassFish Server 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 GlassFish
Server, see the link:../application-deployment-guide/toc.html#GSDPG[GlassFish Server Open Source Edition
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 Java 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 GlassFish Server Open
Source Edition 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 Java EE archive file as laid out by the GlassFish Server. 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 GlassFish
Server Open Source Edition 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`,` 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,oac_no_warn]
----
...
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 GlassFish Server. For example, before stopping GlassFish Server,
undeploy all applications that are running in GlassFish Server.


[width="100%",cols="<100%",]
|=======================================================================
a|
Note:

If you reference a nonembedded GlassFish Server 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,oac_no_warn]
----
...
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,oac_no_warn]
----
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,oac_no_warn]
----
ScatteredArchive(String name,
ScatteredArchive.Type type,
File topDir)
----

 |None

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

 |None

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

 |None

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

 |None

|Gets the deployable URI for this scattered archive a|
[source,oac_no_warn]
----
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,oac_no_warn]
----
...
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,oac_no_warn]
----
ScatteredEnterpriseArchive(String name)
----

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

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

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

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

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

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

 |None
|Gets the deployable URI for this scattered archive a|
[source,oac_no_warn]
----
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,oac_no_warn]
----
...
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 GlassFish Server Embedded Server
API
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Running link:../reference-manual/asadmin.html#GSRFM00263[`asadmin`] commands from an application enables
the application to configure the embedded GlassFish Server 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 GlassFish Server, see
the link:../administration-guide/toc.html#GSADG[GlassFish Server Open Source Edition Administration
Guide]. For detailed information about `asadmin` commands, see Section 1
of the link:../reference-manual/toc.html#GSRFM[GlassFish Server Open Source Edition Reference
Manual].


[width="100%",cols="<100%",]
|=======================================================================
a|
Note:

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

|=======================================================================


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,oac_no_warn]
----
...
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,oac_no_warn]
----
...
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 GlassFish Server].

[[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,oac_no_warn]
----
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 GlassFish Server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you are using http://maven.apache.org/[Apache Maven]
(`http://maven.apache.org/`), the plug-in for embedded GlassFish Server
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 GlassFish Server]
* link:#gijjn[To Redeploy an Application That Was Built and Started From
Maven]
* link:#gjkps[Maven Goals for Embedded GlassFish Server]

Predefined Maven goals for embedded GlassFish Server are described in
link:#gjkps[Maven Goals for Embedded GlassFish Server].

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

[[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 GlassFish Server 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 GlassFish Server. +
Add the following `plugin` element to your POM file: +
[source,oac_no_warn]
----
...
        ...
        <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`. The Maven plug-in is not bound to a specific version
  of GlassFish Server. You can specify the version you want to use. If
  no version is specified, a default version, 3.1 for this release, 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,oac_no_warn]
----
...
        <plugins>
            ...
            <plugin>
                ...
                <configuration>
                    <goalPrefix>embedded-glassfish</goalPrefix>
                    ...
                    <app>target/test.war</app>
                    <port>8080</port>
                    <contextRoot>test</contextRoot>
                    <autoDelete>true</autoDelete>
                    ...
                </configuration>
                ...
            </plugin>
            ...
        </plugins>
...
----
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 GlassFish Server].
3.  Perform advanced plug-in configuration. This step is optional. +
Add the following `configuration` element to your POM file: +
[source,oac_no_warn]
----
...
        <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,oac_no_warn]
----
...
        <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 GlassFish
  Server].
5.  Configure the repository. +
Add the following `repository` element to your POM file: +
[source,oac_no_warn]
----
<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 GlassFish
Server

This example shows a POM file for configuring Maven to use embedded
GlassFish Server.

[source,oac_no_warn]
----
<?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
GlassFish Server.

[[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,oac_no_warn]
----
mvn install
----
This command performs the following actions:
* Installs the Maven repository in a directory named `.m2` under your
home directory.
* Starts Embedded GlassFish Server.
* Deploys your application. +
The application continues to run in Embedded GlassFish Server until
Embedded GlassFish Server is stopped.

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

To Stop Embedded GlassFish Server
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1.  Change to the root directory of the Maven project for your
application.
2.  Run the Maven goal to stop the application in embedded GlassFish
Server. +
[source,oac_no_warn]
----
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 GlassFish Server 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 GlassFish Server until Embedded GlassFish Server 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 GlassFish Server
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

You can use the following Maven goals to test your applications with
embedded GlassFish Server:

* 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
Eclipse GlassFish Server 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 GlassFish Server 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 GlassFish Server 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
Eclipse GlassFish Server 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
++++++++++++++++++++++++++++++++++


[width="100%",cols="<100%",]
|=======================================================================
a|
Note:

If you reference a nonembedded GlassFish Server 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 GlassFish Server 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/toc.html#GSRFM[GlassFish Server Open Source Edition
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 GlassFish Server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

Embedded GlassFish Server 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 GlassFish Server].

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 GlassFish
Server]
* link:#gksnv[EJB 3.1 Embeddable API Properties]
* link:#gjxff[Using Maven with the EJB 3.1 Embeddable API and Embedded
GlassFish Server]

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

To Use the EJB 3.1 Embeddable API with Embedded GlassFish Server
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1.  To specify GlassFish Server 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 GlassFish Server 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/toc.html#GSADG00298[Resources and Services
Administration]" in Eclipse GlassFish Server Administration
Guide. The `jdbc/__default` Java DB database is preconfigured with all
distributions of GlassFish Server. 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 GlassFish Server].
3.  Invoke one of the `createEJBContainer` methods. +

[width="100%",cols="<100%",]
|=======================================================================
a|
Note:

Do not deploy your embeddable EJB application or any of its dependent
Java 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 GlassFish Server.
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` |GlassFish Server 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 GlassFish Server 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 GlassFish Server.

|`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 GlassFish
Server
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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

[[GSESG00018]][[gjxds]]


Example 1-14 Maven POM File for Using the EJB 3.1 Embeddable API with
Embedded GlassFish Server

This example shows a POM file for configuring Maven to use the EJB 3.1
Embeddable API with Embedded GlassFish Server.

[source,oac_no_warn]
----
<!--
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 GlassFish Server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To change log levels in Embedded GlassFish Server, 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 GlassFish Server
logging, see "link:../administration-guide/logging.html#GSADG00010[Administering the Logging Service]" in
Eclipse GlassFish Server Administration Guide.

You can change log levels in Embedded GlassFish Server in either of the
following ways:

* Using the GlassFish Server 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 GlassFish Server Embedded Server API

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

[source,oac_no_warn]
----
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,oac_no_warn]
----
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 GlassFish Server. For example:

[source,oac_no_warn]
----
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 GlassFish Server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

By default, weaving is enabled when the GlassFish Server 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 GlassFish Server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The `glassfish-embedded-web.jar` file for embedded GlassFish Server
supports only these features of nonembedded GlassFish Server:

* The following web technologies of the Java 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 GlassFish Server with these exceptions:

* Installers
* Administration Console
* Update Tool
* Apache Felix OSGi framework
* The Maven plug-in for embedded GlassFish Server 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 GlassFish Server if a nonembedded GlassFish Server is running
in parallel.

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

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

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

* `domains`
* `lib`

If necessary, GlassFish Server also creates an instance root directory.
