type=page
status=published
title=Developing Java Clients
next=connectors.html
prev=container_managed-persistence.html
~~~~~~

= Developing Java Clients

[[GSDVG00012]][[beakt]]


[[developing-java-clients]]
== 10 Developing Java Clients

This chapter describes how to develop, assemble, and deploy Java
clients.

The following topics are addressed here:

* link:#beaku[Introducing the Application Client Container]
* link:#beakv[Developing Clients Using the ACC]
* link:#gkusn[Developing Clients Without the ACC]


[NOTE]
====
The Web Profile of the Oracle{productName} supports the EJB 3.1 Lite
specification, which allows enterprise beans within web applications,
among other features. The full {productName} supports the entire EJB
3.1 specification. For details, see
http://jcp.org/en/jsr/detail?id=318[JSR 318].

Accordingly, the Application Client Container is supported only in the
full {productName}, not in the Web Profile.

JMS resources are supported only in the full {productName}, not in
the Web Profile. See link:jms.html#beaob[Using the Java Message Service].
====


[[beaku]][[GSDVG00159]][[introducing-the-application-client-container]]

=== Introducing the Application Client Container

The Application Client Container (ACC) includes a set of Java classes,
libraries, and other files that are required for and distributed with
Java client programs that execute in their own Java Virtual Machine
(JVM). The ACC manages the execution of Jakarta EE application client
components (application clients), which are used to access a variety of
Jakarta EE services (such as JMS resources, EJB components, web services,
security, and so on.) from a JVM outside the {productName}.

The ACC communicates with the {productName} using RMI-IIOP protocol
and manages the details of RMI-IIOP communication using the client ORB
that is bundled with it. Compared to other Jakarta EE containers, the ACC
is lightweight.

For information about debugging application clients, see
link:debugging-apps.html#gekvq[Application Client Debugging].


[NOTE]
====
Interoperability between application clients and {productName}s
running under different major versions is not supported.
====


[[fvymq]][[GSDVG00459]][[acc-security]]

==== ACC Security

The ACC determines when authentication is needed. This typically occurs
when the client refers to an EJB component that requires authorization
or when annotations in the client's `main` class trigger injection
which, in turn, requires contact with the {productName}'s naming
service. To authenticate the end user, the ACC prompts for any required
information, such as a username and password. The ACC itself provides a
very simple dialog box to prompt for and read these values.

The ACC integrates with the {productName}'s authentication system. It
also supports SSL (Secure Socket Layer)/IIOP if configured and when
necessary; see link:#gckgn[Using RMI/IIOP Over SSL].

You can provide an alternate implementation to gather authentication
information, tailored to the needs of the application client. To do so,
include the class to perform these duties in the application client and
identify the fully-qualified name of this class in the
`callback-handler` element of the `application-client.xml` descriptor
for the client. The ACC uses this class instead of its default class for
asking for and reading the authentication information. The class must
implement the javax.security.auth.callback.CallbackHandler interface.
See the Jakarta EE specification, section 9.2, Application Clients:
Security, for more details.

Application clients can use link:securing-apps.html#beacm[Programmatic
Login Using the ProgrammaticLogin Class].

[[fvymv]][[GSDVG00460]][[acc-naming]]

==== ACC Naming

The client container enables the application clients to use the Java
Naming and Directory Interface (JNDI) to look up Jakarta EE services (such
as JMS resources, EJB components, web services, security, and so on.)
and to reference configurable parameters set at the time of deployment.

[[gbgfe]][[GSDVG00461]][[application-client-annotation]]

==== Application Client Annotation

Annotation is supported for the main class and the optional callback
handler class in application clients. For more information, see
"link:../application-deployment-guide/overview.html#GSDPG00320[Deployment Descriptors and Annotations]" in {productName} Application Deployment Guide.

[[gavkg]][[GSDVG00462]][[java-web-start]]

==== Java Web Start

Java Web Start allows your application client to be easily launched and
automatically downloaded and updated. It is enabled for all application
clients by default. For more information, see link:#gavmf[Using Java Web
Start].

[[gipjj]][[GSDVG00463]][[application-client-jar-file]]

==== Application Client JAR File

In {productName} 7, the downloaded appclient JAR file is smaller
than in previous releases, with dependent classes in separate JAR files.
When copying the downloaded appclient to another location, make sure to
include the JAR files containing the dependent classes as well. You can
also use the `asadmin get-client-stubs` command to retrieve the
appclient and all associated application JAR files and place them in
another location.

[[beakv]][[GSDVG00160]][[developing-clients-using-the-acc]]

=== Developing Clients Using the ACC

This section describes the procedure to develop, assemble, and deploy
client applications using the ACC.

The following topics are addressed here:

* link:#beakw[To Access an EJB Component From an Application Client]
* link:#beakx[To Access a JMS Resource From an Application Client]
* link:#gavmf[Using Java Web Start]
* link:#gipkt[Using the Embeddable ACC]
* link:#beaky[Running an Application Client Using the `appclient`
Script]
* link:#beakz[Using the `package-appclient` Script]
* link:#fvymy[The `client.policy` File]
* link:#gckgn[Using RMI/IIOP Over SSL]
* link:#ghbpc[Connecting to a Remote EJB Module Through a Firewall]
* link:#gipkj[Specifying a Splash Screen]
* link:#gjiec[Setting Login Retries]
* link:#gjpjt[Using Libraries with Application Clients]

[[beakw]][[GSDVG00072]][[to-access-an-ejb-component-from-an-application-client]]

==== To Access an EJB Component From an Application Client

1. In your client code, reference the EJB component by using an `@EJB`
annotation or by looking up the JNDI name as defined in the `ejb-jar.xml` file. +
For more information about naming and lookups, see
link:jndi.html#beans[Accessing the Naming Context]. +
If load balancing is enabled as in Step link:#accejb8[7] and the EJB
components being accessed are in a different cluster, the endpoint list
must be included in the lookup, as follows:
+
[source]
----
corbaname:host1:port1,host2:port2,.../NameService#ejb/jndi-name
----

2. Define the `@EJB` annotations or the `ejb-ref` elements in the
`application-client.xml` file. Define the corresponding `ejb-ref`
elements in the `glassfish-application-client.xml` file. +
For more information on the `glassfish-application-client.xml` file, see
"link:../application-deployment-guide/dd-files.html#GSDPG00081[The glassfish-application-client.xml file]" in
{productName} Application Deployment Guide.
For a general explanation of how to map JNDI names using reference elements,
see link:jndi.html#beaoa[Mapping References].

3. Deploy the application client and EJB component together in an application. +
For more information on deployment, see the
link:../application-deployment-guide/toc.html#GSDPG[{productName} Application Deployment Guide].
To get the client JAR file, use the `--retrieve` option of the `asadmin deploy` command. +
To retrieve the stubs and ties generated during deployment, use the
`asadmin get-client-stubs` command. +
For details, see the
link:../reference-manual/toc.html#GSRFM[{productName} Reference Manual].

4. Ensure that the client JAR file includes the following files:
* A Java class to access the bean.
* `application-client.xml` - (optional) Jakarta EE application client
deployment descriptor.
* `glassfish-application-client.xml` - (optional) {productName}
specific client deployment descriptor. For information on the
`glassfish-application-client.xml` file, see "link:../application-deployment-guide/dd-files.html#GSDPG00081[The
glassfish-application-client.xml file]" in {productName} Application Deployment Guide.
* The `MANIFEST.MF` file. This file contains a reference to the `main`
class, which states the complete package prefix and class name of the
Java client.

5. Prepare the client machine. +
This step is not needed for Java Web Start. This step is not needed if
the client and server machines are the same. +
If you are using the `appclient` script, package the {productName}
system files required to launch application clients on remote systems
using the `package-appclient` script, then retrieve the application
client itself using the `asadmin get-client-stubs` command. +
For more information, see link:#beakz[Using the `package-appclient` Script]
and the link:../reference-manual/toc.html#GSRFM[{productName} Reference Manual].

6. To access EJB components that are residing in a remote system, make
the following changes to the `sun-acc.xml` file or the `appclient`
script. This step is not needed for Java Web Start.
* Define the `target-server` element's `address` and `port` attributes
to reference the remote server machine and its ORB port. See
"link:../application-deployment-guide/dd-elements.html#GSDPG00284[target-server]" in {productName} Application Deployment Guide.
* Use the `-targetserver` option of the appclient script to reference
the remote server machine and its ORB port. For more information, see
link:#beaky[Running an Application Client Using the `appclient` Script].
+
To determine the ORB port on the remote server, use the `asadmin get` command. For example:
+
[source]
----
asadmin --host rmtsrv get server-config.iiop-service.iiop-listener.iiop-listener1.port
----
For more information about the `asadmin get` command, see the
link:../reference-manual/toc.html#GSRFM[{productName} Reference Manual].

7. [[accejb8]]
To set up load balancing and failover of remote EJB references, define
at least two `target-server` elements in the `sun-acc.xml` file or the
`appclient` script. This step is not needed for Java Web Start. +
If the {productName} instance on which the application client is
deployed participates in a cluster, the ACC finds all currently active
IIOP endpoints in the cluster automatically. However, a client should
have at least two endpoints specified for bootstrapping purposes, in
case one of the endpoints has failed. +
The `target-server` elements in the `sun-acc.xml` file specify one or
more IIOP endpoints used for load balancing. The `address` attribute is
an IPv4 address or host name, and the `port` attribute specifies the
port number. See "link:../application-deployment-guide/dd-elements.html#GSDPG00111[client-container]" in {productName} Application Deployment Guide. +
The `--targetserver` option of the appclient script specifies one or
more IIOP endpoints used for load balancing. For more information, see
link:#beaky[Running an Application Client Using the `appclient` Script].

[[GSDVG555]]

Next Steps

* For instructions on running the application client, see
link:#gavmf[Using Java Web Start] or link:#beaky[Running an Application
Client Using the `appclient` Script].
* For more information about RMI-IIOP load balancing and failover, see
"link:../ha-administration-guide/rmi-iiop.html#GSHAG00013[RMI-IIOP Load Balancing and Failover]" in {productName} High Availability Administration Guide.

[[beakx]][[GSDVG00073]][[to-access-a-jms-resource-from-an-application-client]]

==== To Access a JMS Resource From an Application Client

1. Create a JMS client.
+
For detailed instructions on developing a JMS client, see
https://eclipse-ee4j.github.io/jakartaee-tutorial/#jakarta-messaging-examples[
Java Message Service Examples]" in The Jakarta EE Tutorial.
2. Next, configure a JMS resource on the {productName}.
+
For information on configuring JMS resources, see
"link:../administration-guide/jms.html#GSADG00598[Administering JMS Connection Factories and
Destinations]" in {productName} Administration
Guide.
3. Define the `@Resource` or `@Resources` annotations or the
`resource-ref` elements in the `application-client.xml` file. Define the
corresponding `resource-ref` elements in the
`glassfish-application-client.xml` file.
+
For more information on the `glassfish-application-client.xml` file, see
"link:../application-deployment-guide/dd-files.html#GSDPG00081[The glassfish-application-client.xml file]" in
{productName} Application Deployment Guide. For a
general explanation of how to map JNDI names using reference elements,
see link:jndi.html#beaoa[Mapping References].
4. Ensure that the client JAR file includes the following files:
* A Java class to access the resource.
* `application-client.xml` - (optional) Jakarta EE application client
deployment descriptor.
* `glassfish-application-client.xml` - (optional) {productName}
specific client deployment descriptor. For information on the
`glassfish-application-client.xml` file, see "link:../application-deployment-guide/dd-files.html#GSDPG00081[The
glassfish-application-client.xml file]" in {productName} Application Deployment Guide.
* The `MANIFEST.MF` file. This file contains a reference to the `main`
class, which states the complete package prefix and class name of the
Java client.
5. Prepare the client machine.
+
This step is not needed for Java Web Start. This step is not needed if
the client and server machines are the same.
+
If you are using the `appclient` script, package the {productName}
system files required to launch application clients on remote systems
using the `package-appclient` script, then retrieve the application
client itself using the `asadmin get-client-stubs` command.
+
For more information, see link:#beakz[Using the `package-appclient`
Script] and the link:../reference-manual/toc.html#GSRFM[{productName}
Reference Manual].
6. Run the application client.
+
See link:#gavmf[Using Java Web Start] or link:#beaky[Running an
Application Client Using the `appclient` Script].

[[gavmf]][[GSDVG00464]][[using-java-web-start]]

==== Using Java Web Start

Java Web Start allows your application client to be easily launched and
automatically downloaded and updated. General information about Java Web
Start is available at
`http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136112.html`.

The following topics are addressed here:

* link:#gavqb[Enabling and Disabling Java Web Start]
* link:#gavmk[Downloading and Launching an Application Client]
* link:#gavor[The Application Client URL]
* link:#gcjlg[Signing JAR Files Used in Java Web Start]
* link:#geqxg[Error Handling]
* link:#geqwd[Vendor Icon, Splash Screen, and Text]
* link:#gkmbs[Creating a Custom JNLP File]

[[gavqb]][[GSDVG00312]][[enabling-and-disabling-java-web-start]]

===== Enabling and Disabling Java Web Start

Java Web Start is enabled for all application clients by default.

The application developer or deployer can specify that Java Web Start is
always disabled for an application client by setting the value of the
`eligible` element to `false` in the `glassfish-application-client.xml`
file. See the link:../application-deployment-guide/toc.html#GSDPG[{productName}
Application Deployment Guide].

The {productName} administrator can disable Java Web Start for a
previously deployed eligible application client using the `asadmin set`
command.

To disable Java Web Start for all eligible application clients in an
application, use the following command:

[source]
----
asadmin set applications.application.app-name.property.java-web-start-enabled="false"
----

To disable Java Web Start for a stand-alone eligible application client,
use the following command:

[source]
----
asadmin set applications.application.module-name.property.java-web-start-enabled="false"
----

Setting `java-web-start-enabled="true"` re-enables Java Web Start for an
eligible application client. For more information about the
`asadmin set` command, see the link:../reference-manual/toc.html#GSRFM[{productName} Reference Manual].

[[gavmk]][[GSDVG00313]][[downloading-and-launching-an-application-client]]

===== Downloading and Launching an Application Client

If Java Web Start is enabled for your deployed application client, you
can launch it for testing. Simply click on the Launch button next to the
application client or application's listing on the App Client Modules
page in the Administration Console.

On other machines, you can download and launch the application client
using Java Web Start in the following ways:

* Using a web browser, directly enter the URL for the application
client. See link:#gavor[The Application Client URL].
* Click on a link to the application client from a web page.
* Use the Java Web Start command `javaws`, specifying the URL of the
application client as a command line argument.
* If the application has previously been downloaded using Java Web
Start, you have additional alternatives.

** Use the desktop icon that Java Web Start created for the application
client. When Java Web Start downloads an application client for the
first time it asks you if such an icon should be created.

** Use the Java Web Start control panel to launch the application
client.

When you launch an application client, Java Web Start contacts the
server to see if a newer client version is available. This means you can
redeploy an application client without having to worry about whether
client machines have the latest version.

[[gavor]][[GSDVG00314]][[the-application-client-url]]

===== The Application Client URL

The default URL for an application or module generally is as follows:

[source]
----
http://host:port/context-root
----

The default URL for a stand-alone application client module is as
follows:

[source]
----
http://host:port/appclient-module-id
----

The default URL for an application client module embedded within an
application is as follows. Note that the relative path to the
application client JAR file is included.

[source]
----
http://host:port/application-id/appclient-path
----

If the context-root, appclient-module-id, or application-id is not
specified during deployment, the name of the JAR or EAR file without the
extension is used. If the application client module or application is
not in JAR or EAR file format, an appclient-module-id or application-id
is generated.

Regardless of how the context-root or id is determined, it is written to
the server log when you deploy the application. For details about
naming, see "link:../application-deployment-guide/overview.html#GSDPG00323[Naming Standards]" in {productName} Application Deployment Guide.

To set a different URL for an application client, use the `context-root`
subelement of the `java-web-start-access` element in the
`glassfish-application-client.xml` file. This overrides the
appclient-module-id or application-id. See the link:../application-deployment-guide/toc.html#GSDPG[{productName} Application Deployment Guide].

You can also pass arguments to the ACC or to the application client's
`main` method as query parameters in the URL. If multiple application
client arguments are specified, they are passed in the order specified.

A question mark separates the context root from the arguments.
Ampersands (`&`) separate the arguments and their values. Each argument
and each value must begin with `arg=`. Here is an example URL with a
`-color` argument for a stand-alone application client. The `-color`
argument is passed to the application client's `main` method.

[source]
----
http://localhost:8080/testClient?arg=-color&arg=red
----


[NOTE]
====
If you are using the `javaws` URL command to launch Java Web Start with
a URL that contains arguments, enclose the URL in double quotes (`"`) to
avoid breaking the URL at the ampersand (`&`) symbol.
====


Ideally, you should build your production application clients with
user-friendly interfaces that collect information which might otherwise
be gathered as command-line arguments. This minimizes the degree to
which users must customize the URLs that launch application clients
using Java Web Start. Command-line argument support is useful in a
development environment and for existing application clients that depend
on it.

[[gcjlg]][[GSDVG00315]][[signing-jar-files-used-in-java-web-start]]

===== Signing JAR Files Used in Java Web Start

Java Web Start enforces a security sandbox. By default it grants any
application, including application clients, only minimal privileges.
Because Java Web Start applications can be so easily downloaded, Java
Web Start provides protection from potentially harmful programs that
might be accessible over the network. If an application requires a
higher privilege level than the sandbox permits, the code that needs
privileges must be in a JAR file that was signed.

When Java Web Start downloads such a signed JAR file, it displays
information about the certificate that was used to sign the JAR if that
certificate is not trusted. It then asks you whether you want to trust
that signed code. If you agree, the code receives elevated permissions
and runs. If you reject the signed code, Java Web Start does not start
the downloaded application.

Your first Java Web Start launch of an application client is likely to
involve this prompting because by default {productName} uses a
self-signed certificate that is not linked to a trusted authority.

The {productName} serves two types of signed JAR files in response to
Java Web Start requests. One type is a JAR file installed as part of the
{productName}, which starts an application client during a Java Web
Start launch: as-install``/lib/gf-client.jar``.

The other type is a generated application client JAR file. As part of
deployment, the {productName} generates a new application client JAR
file that contains classes, resources, and descriptors needed to run the
application client on end-user systems. When you deploy an application
with the `asadmin deploy` command's `--retrieve` option, use the
`asadmin get-client-stubs` command, or select the Generate RMIStubs
option from the EJB Modules deployment page in the Administration
Console, this is one of the JAR files retrieved to your system. Because
application clients need access beyond the minimal sandbox permissions
to work in the Java Web Start environment, the generated application
client JAR file must be signed before it can be downloaded to and
executed on an end-user system.

A JAR file can be signed automatically or manually.

The following topics are addressed here:

* link:#gcjmd[Automatically Signing JAR Files]
* link:#gcjlr[Using the `jar-signing-alias` Deployment Property]

[[gcjmd]][[GSDVG00038]][[automatically-signing-jar-files]]

Automatically Signing JAR Files

The {productName} automatically creates a signed version of the
required JAR file if none exists. When a Java Web Start request for the
`gf-client.jar` file arrives, the {productName} looks for
domain-dir`/java-web-start/gf-client.jar`. When a request for an
application's generated application client JAR file arrives, the
{productName} looks in the directory
domain-dir`/java-web-start/`app-name for a file with the same name as
the generated JAR file created during deployment.

In either case, if the requested signed JAR file is absent or older than
its unsigned counterpart, the {productName} creates a signed version
of the JAR file automatically and deposits it in the relevant directory.
Whether the {productName} just signed the JAR file or not, it serves
the file from the domain-dir`/java-web-start` directory tree in response
to the Java Web Start request.

To sign these JAR files, by default the {productName} uses its
self-signed certificate. When you create a new domain, either by
installing the {productName} or by using the `asadmin create-domain`
command, the {productName} creates a self-signed certificate and adds
it to the domain's key store.

A self-signed certificate is generally untrustworthy because no
certification authority vouches for its authenticity. The automatic
signing feature uses the same certificate to create all required signed
JAR files.

Starting with Java SE 7 Update 21, stricter security is enforced for
applications launched using Java Web Start. Application users will see
various security messages, depending on their Java security settings. If
Java security is set to Very High on their systems, users will not be
able to launch application clients signed using the {productName}
self-signed certificate.

To minimize impacts to application users, all Java Web Start
applications should be signed with a trusted certificate instead of the
{productName} self-signed certificate. If you use the {productName} Java Web Start feature or deploy applications that provide their
own Java Web Start applications, perform the following steps:

1. Obtain a trusted certificate from a certification authority if your
organization does not already have one.

2. Stop {productName}.

3. Replace the {productName} self-signed certificate with the
trusted certificate by importing the trusted certificate into the
{productName} keystore using the `s1as` alias. By default, the
keystore is located at domain-dir`/config/keystore.jks`.
+
For more information about importing a trusted certificate into the
domain keystore, see "link:../security-guide/system-security.html#GSSCG00147[Administering JSSE Certificates]"
in {productName} Security Guide.

4. Delete any signed JARs already generated by {productName}:
.. At the command prompt, type: +
``rm -rf`` domain-dir``/java_web_start``
.. For each application that contains an application client launched
using Java Web Start, type: +
``rm -rf`` domain-dir``/generated/xml/``app-name``/signed``
.. Restart {productName}.

5. Ensure that the Java security setting on user systems is set to Very High.

After you perform these steps, the first time a user launches an
application client on their system, Java Web Start detects that the
server's signed JARs are newer than those cached on the user's system
and downloads them again. This happens on the first launch only,
regardless of the client. Even though the application client is now
signed using a trusted certificate, users will again be asked whether to
trust the downloaded application and can choose to skip that prompt for
future launches.

[[gcjlr]][[GSDVG00039]][[using-the-jar-signing-alias-deployment-property]]

Using the `jar-signing-alias` Deployment Property

The `asadmin deploy` command property `jar-signing-alias` specifies the
alias for the security certificate with which the application client
container JAR file is signed.

Java Web Start won't execute code requiring elevated permissions unless
it resides in a JAR file signed with a certificate that the user's
system trusts. For your convenience, {productName} signs the JAR file
automatically using the self-signed certificate from the domain, `s1as`.
Java Web Start then asks the user whether to trust the code and displays
the {productName} certificate information.

To sign this JAR file with a different certificate, first add the
certificate to the domain keystore. You can use a certificate from a
trusted authority, which avoids the Java Web Start prompt. To add a
certificate to the domain keystore, see "link:../security-guide/system-security.html#GSSCG00147[Administering
JSSE Certificates]" in {productName} Security
Guide.

Next, deploy your application using the `jar-signing-alias` property.
For example:

[source]
----
asadmin deploy --property jar-signing-alias=MyAlias MyApp.ear
----

For more information about the `asadmin deploy` command, see the
link:../reference-manual/toc.html#GSRFM[{productName} Reference Manual].

[[geqxg]][[GSDVG00316]][[error-handling]]

===== Error Handling

When an application client is launched using Java Web Start, any error
that the application client logic does not catch and handle is written
to `System.err` and displayed in a dialog box. This display appears if
an error occurs even before the application client logic receives
control. It also appears if the application client code does not catch
and handle errors itself.

[[geqwd]][[GSDVG00317]][[vendor-icon-splash-screen-and-text]]

===== Vendor Icon, Splash Screen, and Text

To specify a vendor-specific icon, splash screen, text string, or a
combination of these for Java Web Start download and launch screens, use
the `vendor` element in the `glassfish-application-client.xml` file. The
complete format of this element's data is as follows:

[source,xml]
----
<vendor>icon-image-URI::splash-screen-image-URI::vendor-text</vendor>
----

The following example vendor element contains an icon, a splash screen,
and a text string:

[source,xml]
----
<vendor>images/icon.jpg::otherDir/splash.jpg::MyCorp, Inc.</vendor>
----

The following example vendor element contains an icon and a text string:

[source,xml]
----
<vendor>images/icon.jpg::MyCorp, Inc.</vendor>
----

The following example vendor element contains a splash screen and a text
string; note the initial double colon:

[source,xml]
----
<vendor>::otherDir/splash.jpg::MyCorp, Inc.</vendor>
----

The following example vendor element contains only a text string:

[source,xml]
----
<vendor>MyCorp, Inc.</vendor>
----

The default value is the text string `Application Client`.

For more information about the `glassfish-application-client.xml` file,
see the link:../application-deployment-guide/toc.html#GSDPG[{productName} Application
Deployment Guide].

You can also specify a vendor-specific icon, splash screen, text string,
or a combination by using a custom JNLP file; see link:#gkmbs[Creating a
Custom JNLP File].

[[gkmbs]][[GSDVG00318]][[creating-a-custom-jnlp-file]]

===== Creating a Custom JNLP File

You can partially customize the Java Network Launching Protocol (JNLP)
file that {productName} uses for Java Web Start.

The following topics are addressed here:

* link:#gkmco[Specifying the JNLP File in the Deployment Descriptor]
* link:#gkmbq[Referring to JAR Files from the JNLP File]
* link:#gkmbt[Referring to Other JNLP Files]
* link:#gkmbr[Combining Custom and Automatically Generated Content]

For more information about JNLP, see the
http://java.sun.com/javase/technologies/desktop/javawebstart/download-spec.html[Java
Web Start Architecture JNLP Specification and API Documentation]
(`http://java.sun.com/javase/technologies/desktop/javawebstart/download-spec.html`).

[[gkmco]][[GSDVG00040]][[specifying-the-jnlp-file-in-the-deployment-descriptor]]

Specifying the JNLP File in the Deployment Descriptor

To specify a custom JNLP file for Java Web Start, use the `jnlp-doc`
element in the `glassfish-application-client.xml` file. If none is
specified, a default JNLP file is generated.

The value of the `jnlp-doc` element is a relative path with the
following format:

[source]
----
[path-to-JAR-in-EAR!]path-to-JNLP-in-JAR
----

The default path-to-JAR-in-EAR is the current application client JAR
file. For example, if the JNLP file is in the application client JAR
file at `custom/myInfo.jnlp`, the element value would look like this:

[source,xml]
----
<java-web-start-access>
   <jnlp-doc>custom/myInfo.jnlp</jnlp-doc>
</java-web-start-access>
----

If the application client is inside an EAR file, you can place the
custom JNLP file inside another JAR file in the EAR. For example, if the
JNLP file is in a JAR file at `other/myLib.jar`, the element value would
look like this, with an exclamation point (`!`) separating the path to
the JAR from the path in the JAR:

[source,xml]
----
<java-web-start-access>
   <jnlp-doc>other/myLib.jar!custom/myInfo.jnlp</jnlp-doc>
</java-web-start-access>
----

For more information about the `glassfish-application-client.xml` file,
see the {productName} Application Deployment
Guide.

[[gkmbq]][[GSDVG00041]][[referring-to-jar-files-from-the-jnlp-file]]

Referring to JAR Files from the JNLP File

As with any JNLP document, the custom JNLP file can refer to JAR files
the application client requires.

Do not specify every JAR on which the client depends. {productName}
automatically handles JAR files that the Jakarta EE specification requires
to be available to the application client. This includes JAR files
listed in the application client JAR file's manifest `Class-Path` and
JAR files in the EAR file's library directory (if any) and their
transitive closures. The custom JNLP file should specify only those JAR
files the client needs that {productName} would not otherwise
include.

Package these JAR files in the EAR file, as with any JAR file required
by an application client. Use relative URIs in the `<jar href="...">`
and `<nativelib href="...">` elements to point to the JAR files. The
codebase that {productName} assigns for the final client JNLP file
corresponds to the top level of the EAR file. Therefore, relative `href`
references correspond directly to the relative path to the JAR files
within the EAR file.

Neither the Jakarta EE specification nor {productName} supports
packaging JAR files inside the application client JAR file itself.
Nothing prevents this, but {productName} does no special processing
of such JAR files. They do not appear in the runtime class path and they
cannot be referenced from the custom JNLP file.

[[gkmbt]][[GSDVG00042]][[referring-to-other-jnlp-files]]

Referring to Other JNLP Files

The JNLP file can also refer to other custom JNLP files using
`<extension href="..."/>` elements. To be consistent with relative
`href` references to JAR files, the relative `href` references to JNLP
files are resolved within the EAR file. You can place these JNLP files
directly in the EAR file or inside JAR files that the EAR file contains.
Use one of these formats for these `href` references:

[source]
----
[path-to-JAR-in-EAR!]path-to-JNLP-in-JAR

path-to-JNLP-in-EAR
----

Note that these formats are not equivalent to the format of the
`jnlp-doc` element in the `glassfish-application-client.xml` file.

These formats follow the standard entry-within-a-JAR URI syntax and
semantics. Support for this syntax comes from the automated Java Web
Start support in {productName}. This is not a feature of Java Web
Start or the JNLP standard.

[[gkmbr]][[GSDVG00043]][[combining-custom-and-automatically-generated-content]]

Combining Custom and Automatically Generated Content

{productName} recognizes these types of content in the JNLP file:

* Owned — {productName} owns the content and ignores any custom
content
* Merged — Automatically generated content and custom content are merged
* Defaulted — Custom content is used if present, otherwise default
content is provided

You can compose a complete JNLP file and package it with the application
client. {productName} then combines it with its automatically
generated JNLP file. You can also provide content that only adds to or
replaces what {productName} generates. The custom content must
conform to the general structure of the JNLP format so that {productName} can properly place it in the final JNLP file.

For example, to specify a single native library to be included only for
Windows systems, the new element to add might be as follows:

[source,xml]
----
<nativelib href="windows/myLib.jar"/>
----

However, you must indicate where in the overall document this element
belongs. The actual custom JNLP file should look like this:

[source,xml]
----
<jnlp>
   <resources os="Windows">
      <nativelib href="windows/myLib.jar"/>
   </resources>
</jnlp>
----

{productName} provides default `<information>` and `<resources>`
elements, without specifying attributes such as `os`, `arch`,
`platform`, or `locale`. {productName} merges its own content within
those elements with custom content under those elements. Further, you
can provide your own `<information>` and `<resources>` elements (and
fragments within them) that specify at least one of these attributes.

In general, you can perform the following customizations:

* Override the {productName} defaults for the child elements of
`<information>` elements that have no attribute settings for `os`,
`arch`, `platform`, and `locale`. Among these child elements are
`<title>`, `<vendor>`, `<description>`, `<icon>`, and so on.
* Add `<information>` elements with `os`, `arch`, `platform`, or
`locale` settings. You can also add child elements.
* Add child elements of `<resources>` elements that have no attribute
settings for `os`, `arch`, or `locale`. Among these child elements are
`<jar>`, `<property>`, `<nativelib>`, and so on. You can also customize
attributes of the `<java>` child element.
* Add `<resources>` elements that specify at least one of `os`, `arch`,
or `locale`. You can also add child elements.

This flexibility allows you to add JAR files to the application
(including platform-specific native libraries) and set properties to
control the behavior of your application clients.

The following tables provide more detail about what parts of the JNLP
file you can add to and modify.

[[GSDVG556]][[sthref24]][[gkmbk]]


Table 10-1 Owned JNLP File Content

[width="100%",cols="32%,68%",options="header",]
|===
|JNLP File Fragment |Description
a|
[source,xml]
----
<jnlp codebase="xxx" ...>
----

 |{productName} controls this content for application clients
packaged in EAR files. The developer controls this content for
application clients packaged in WAR files.

a|
[source,xml]
----
<jnlp href="xxx" ...>
----

 |{productName} controls this content for application clients
packaged in EAR files. The developer controls this content for
application clients packaged in WAR files.

a|
[source,xml]
----
<jnlp>
  <security>
----

 |{productName} must control the permissions requested for each JNLP
file. All permissions are needed for the main file, which launches the
ACC. The permissions requested for other JNLP documents depend on
whether the JAR files referenced in those documents are signed.

a|
[source,xml]
----
<jnlp>
  <application-desc>
    <argument> ...
----

 |{productName} sets the `main-class` and the arguments to be passed
to the client.
|===


[[GSDVG557]][[sthref25]][[gkmci]]


Table 10-2 Defaulted JNLP File Content

[width="100%",cols="39%,61%",options="header",]
|===
|JNLP File Fragment |Description
a|
[source,xml]
----
<jnlp spec="xxx" ...>
----

 |Specifies the JNLP specification version.

a|
[source,xml]
----
<jnlp>
  <information [no-attributes]>
----

 |Specifies the application title, vendor, home page, various
description text values, icon images, and whether offline execution is
allowed.

a|
[source,xml]
----
<jnlp>
  <resources [no-attributes]>
    <java version="xxx"
        java-vm-args="yyy" ...>
----

 |Specifies the Java SE version or selected VM parameter settings.
|===


[[GSDVG558]][[sthref26]][[gkmcc]]


Table 10-3 Merged JNLP File Content

[width="100%",cols="37%,63%",options="header",]
|===
|JNLP File Fragment |Description
a|
[source,xml]
----
<jnlp>
  <information [attributes]>
----

 |You can specify one or more of the `os`, `arch`, `platform`, and
`locale` attributes for the `<information>` element. You can also
specify child elements; {productName} provides no default children.

a|
[source,xml]
----
<jnlp>
  <resources [attributes]>
----

 |You can specify one or more of the `os`, `arch`, `platform`, and
`locale` attributes for the `<resources>` element. You can also specify
child elements; {productName} provides no default children.

a|
[source,xml]
----
<jnlp>
  <resources [no-attributes]>
    <jar ...>
----

 |Adds JAR files to be included in the application to the JAR files
provided by {productName}.

a|
[source,xml]
----
<jnlp>
  <resources [no-attributes]>
    <nativelib ...>
----

 |Adds native libraries to be included in the application. Each entry in
a JAR listed in a `<nativelib>` element must be a native library for the
correct platform. The full syntax of the `<nativelib>` element lets the
developer specify the platform for that native library.

a|
[source,xml]
----
<jnlp>
  <resources [no-attributes]>
    <property ...>
----

 |Adds system properties to be included in the application to the system
properties defined by {productName}.

a|
[source,xml]
----
<jnlp>
  <resources [no-attributes]>
    <extension ...>
----

 |Specifies another custom JNLP file.

a|
[source,xml]
----
<jnlp>
  <component-desc ...>
----

 |Includes another custom JNLP file that specifies a component
extension.

a|
[source,xml]
----
<jnlp>
  <installer-desc ...>
----

 |Includes another custom JNLP file that specifies an installer
extension.
|===


[[gipkt]][[GSDVG00465]][[using-the-embeddable-acc]]

==== Using the Embeddable ACC

You can embed the ACC into your application client. If you place the
as-install``/lib/gf-client.jar`` file in your runtime classpath, your
application creates the ACC after your application code has started,
then requests that the ACC start the application client portion. The
basic model for coding is as follows:

1. Create a builder object.
2. Operate on the builder to configure the ACC.
3. Obtain a new ACC instance from the builder.
4. Present a client archive or class to the ACC instance.
5. Start the client running within the newly created ACC instance.

Your code should follow this general pattern:

[source,java]
----
// one TargetServer for each ORB endpoint for bootstrapping
TargetServer[] servers = ...;

// Get a builder to set up the ACC
AppClientContainer.Builder builder = AppClientContainer.newBuilder(servers);

// Fine-tune the ACC's configuration. Note ability to "chain" invocations.
builder.callbackHandler("com.acme.MyHandler").authRealm("myRealm"); // Modify config

// Get a container for a client.
URI clientURI = ...; // URI to the client JAR
AppClientContainer acc = builder.newContainer(clientURI);

or

Class mainClass = ...;
AppClientContainer acc = builder.newContainer(mainClass);

// In either case, start the client running.
String[] appArgs = ...;
acc.startClient(appArgs); // Start the client

...

acc.close(); // close the ACC(optional)
----

The ACC loads the application client's `main` class, performs any
required injection, and transfers control to the `static main` method.
The ACC's `run` method returns to the calling application as soon as the
client's `main` method returns to the ACC.

If the application client's `main` method starts any asynchronous
activity, that work continues after the ACC returns. The ACC has no
knowledge of whether the client's `main` method triggers asynchronous
work. Therefore, if the client causes work on threads other than the
calling thread, and if the embedding application needs to know when the
client's asynchronous work completes, the embedding application and the
client must agree on how this happens.

The ACC's shutdown handling is invoked from the ACC's `close` method.
The calling application can invoke `acc.close()` to close down any
services started by the ACC. If the application client code started any
asynchronous activity that might still depend on ACC services, invoking
`close` before that asynchronous activity completes could cause
unpredictable and undesirable results. The shutdown handling is also run
automatically at VM shutdown if the code has not invoked `close` before
then.

The ACC does not prevent the calling application from creating or
running more than one ACC instance during a single execution of the
application either serially or concurrently. However, other services
used by the ACC (transaction manager, security, ORB, and so on) might or
might not support such serial or concurrent reuse.

[[beaky]][[GSDVG00466]][[running-an-application-client-using-the-appclient-script]]

==== Running an Application Client Using the `appclient` Script

To run an application client, you can launch the ACC using the
`appclient` script, whether or not Java Web Start is enabled. This is
optional. This script is located in the as-install``/bin`` directory. For
details, see the link:../reference-manual/toc.html#GSRFM[{productName}
Reference Manual].

[[beakz]][[GSDVG00467]][[using-the-package-appclient-script]]

==== Using the `package-appclient` Script

You can package the {productName} system files required to launch
application clients on remote systems into a single JAR file using the
`package-appclient` script. This is optional. This script is located in
the as-install``/bin`` directory. For details, see the
link:../reference-manual/toc.html#GSRFM[{productName} Reference Manual].

[[fvymy]][[GSDVG00468]][[the-client.policy-file]]

==== The `client.policy` File

The `client.policy` file is the J2SE policy file used by the application
client. Each application client has a `client.policy` file. The default
policy file limits the permissions of Jakarta EE deployed application
clients to the minimal set of permissions required for these
applications to operate correctly. If an application client requires
more than this default set of permissions, edit the `client.policy` file
to add the custom permissions that your application client needs. Use
the J2SE standard policy tool or any text editor to edit this file.

For more information on using the J2SE policy tool, see
`http://docs.oracle.com/javase/tutorial/security/tour2/index.html`.

For more information about the permissions you can set in the
`client.policy` file, see
`http://docs.oracle.com/javase/7/docs/technotes/guides/security/permissions.html`.

[[gckgn]][[GSDVG00469]][[using-rmiiiop-over-ssl]]

==== Using RMI/IIOP Over SSL

You can configure RMI/IIOP over SSL in two ways: using a username and
password, or using a client certificate.

To use a username and password, configure the `ior-security-config`
element in the `glassfish-ejb-jar.xml` file. The following configuration
establishes SSL between an application client and an EJB component using
a username and password. The user has to login to the ACC using either
the `sun-acc.xml` mechanism or the
link:securing-apps.html#beacm[Programmatic Login Using the
ProgrammaticLogin Class] mechanism.

[source,xml]
----
<ior-security-config>
  <transport-config>
    <integrity>required</integrity>
    <confidentiality>required</confidentiality>
    <establish-trust-in-target>supported</establish-trust-in-target>
    <establish-trust-in-client>none</establish-trust-in-client>
  </transport-config>
  <as-context>
    <auth-method>username_password</auth-method>
    <realm>default</realm>
    <required>true</required>
  </as-context>
 <sas-context>
    <caller-propagation>none</caller-propagation>
 </sas-context>
</ior-security-config>
----

For more information about the `glassfish-ejb-jar.xml` and `sun-acc.xml`
files, see the link:../application-deployment-guide/toc.html#GSDPG[{productName}
Application Deployment Guide].

To use a client certificate, configure the `ior-security-config` element
in the `glassfish-ejb-jar.xml` file. The following configuration
establishes SSL between an application client and an EJB component using
a client certificate.

[source,xml]
----
<ior-security-config>
  <transport-config>
    <integrity>required</integrity>
    <confidentiality>required</confidentiality>
    <establish-trust-in-target>supported</establish-trust-in-target>
    <establish-trust-in-client>required</establish-trust-in-client>
  </transport-config>
  <as-context>
    <auth-method>none</auth-method>
    <realm>default</realm>
    <required>false</required>
  </as-context>
  <sas-context>
    <caller-propagation>none</caller-propagation>
  </sas-context>
</ior-security-config>
----

To use a client certificate, you must also specify the system properties
for the keystore and truststore to be used in establishing SSL. To use
SSL with the Application Client Container (ACC), you need to set these
system properties in one of the following ways:

* Use the new syntax of the `appclient` script and specify the system
properties as JVM options. See link:#beaky[Running an Application Client
Using the `appclient` Script].
* Set the environment variable `VMARGS` in the shell. For example, in
the `ksh` or `bash` shell, the command to set this environment variable
would be as follows:
+
[source]
----
export VMARGS="-Djavax.net.ssl.keyStore=${keystore.db.file}
-Djavax.net.ssl.trustStore=${truststore.db.file}
-Djavax.net.ssl.keyStorePass word=${ssl.password}
-Djavax.net.ssl.trustStorePassword=${ssl.password}"
----
* Optionally, you can set the `env` element using Ant. For example:
+
[source,xml]
----
<target name="runclient">
  <exec executable="${S1AS_HOME}/bin/appclient">
    <env key="VMARGS" value=" -Djavax.net.ssl.keyStore=${keystore.db.file}
      -Djavax.net.ssl.trustStore=${truststore.db.file}
      -Djavax.net.ssl.keyStorePasword=${ssl.password}
      -Djavax.net.ssl.trustStorePassword=${ssl.password}"/>
    <arg value="-client"/>
    <arg value="${appClient.jar}"/>
  </exec>
</target>
----

[[ghbpc]][[GSDVG00470]][[connecting-to-a-remote-ejb-module-through-a-firewall]]

==== Connecting to a Remote EJB Module Through a Firewall

To deploy and run an application client that connects to an EJB module
on a {productName} instance that is behind a firewall, you must set
ORB Virtual Address Agent Implementation (ORBVAA) options. Use the
`asadmin create-jvm-options` command as follows:

[source]
----
asadmin create-jvm-options -Dcom.sun.corba.ee.ORBVAAHost=public-IP-adress
asadmin create-jvm-options -Dcom.sun.corba.ee.ORBVAAPort=public-port
asadmin create-jvm-options
-Dcom.sun.corba.ee.ORBUserConfigurators.com.sun.corba.ee.impl.plugin.hwlb.VirtualAddressAgentImpl=x
----

Set the `ORBVAAHost` and `ORBVAAPort` options to the host and port of
the public address. The `ORBUserConfigurators` option tells the ORB to
create an instance of the `VirtualAddressAgentImpl` class and invoke the
`configure` method on the resulting object, which must implement the
com.sun.corba.ee.spi.orb.ORBConfigurator interface. The
`ORBUserConfigurators` value doesn't matter. Together, these options
create an ORB that in turn creates `Object` references (the underlying
implementation of remote EJB references) containing the public address,
while the ORB listens on the private address specified for the IIOP port
in the {productName} configuration.

[[gipkj]][[GSDVG00471]][[specifying-a-splash-screen]]

==== Specifying a Splash Screen

Java SE 6 offers splash screen support, either through a Java
command-line option or a manifest entry in the application's JAR file.
To take advantage of this Java SE feature in your application client,
you can do one of the following:

* Create the appclient JAR file so that its manifest contains a
`SplashScreen-Image` entry that specifies the path to the image in the
client. The `java` command displays the splash screen before starting
the ACC or your client, just as with any Java application.
* Use the new `appclient ... -jar` launch format, using the `-splash`
command-line option at runtime or the `SplashScreen-Image` manifest
entry at development time. See link:#beaky[Running an Application Client
Using the `appclient` Script].
* In the environment that runs the `appclient` script, set the `VMOPTS`
environment variable to include the `-splash` option before invoking the
`appclient` script to launch the client.
* Build an application client that uses the embeddable ACC feature and
specify the splash screen image using one of the following:

** The `-splash` option of the `java` command

** `SplashScreen-Image` in the manifest for your program (not the
manifest for the application client)
+
See link:#gipkt[Using the Embeddable ACC].

During application (EAR file) deployment, the {productName} generates
façade JAR files, one for the application and one for each application
client in the application. During application client module deployment,
the {productName} generates a single facade JAR for the application
client. The `appclient` script supports splash screens inside the
application client JAR only if you launch an application client facade
or appclient client JAR. If you launch the facade for an application or
the undeployed application itself, the `appclient` script cannot take
advantage of the Java SE 6 splash screen feature.

[[gjiec]][[GSDVG00472]][[setting-login-retries]]

==== Setting Login Retries

You can set a JVM option using the `appclient` script that determines
the number of login retries allowed. This option is
`-Dorg.glassfish.appclient.acc.maxLoginRetries=`n where n is a positive
integer. The default number of retries is 3.

This retry loop happens when the ACC attempts to perform injection if
you annotated the client's `main` class (for example, using
`@Resource`). If instead of annotations your client uses the
`InitialContext` explicitly to look up remote resources, the retry loop
does not apply. In this case, you could write logic to catch an
exception around the lookup and retry explicitly.

For details about the `appclient` script syntax, see the
link:../reference-manual/toc.html#GSRFM[{productName} Reference Manual].

[[gjpjt]][[GSDVG00473]][[using-libraries-with-application-clients]]

==== Using Libraries with Application Clients

The Libraries field in the Administration Console's deployment page and
the `--libraries` option of the `asadmin deploy` command do not apply to
application clients. Neither do the as-install``/lib``, domain-dir``/lib``,
and domain-dir`/lib/classes` directories comprising the Common Class
Loader. These apply only to applications and modules deployed to the
server. For more information, see link:class-loaders.html#beade[Class
Loaders].

To use libraries with an application client, package the application
client in an application (EAR file). Then, either place the libraries in
the ``/lib`` directory of the EAR file or specify their location in the
application client JAR file's manifest `Class-Path`.

[[gkusn]][[GSDVG00161]][[developing-clients-without-the-acc]]

=== Developing Clients Without the ACC

This section describes the procedure to create, assemble, and deploy a
Java-based client that is not packaged using the Application Client
Container (ACC).

The following topics are addressed here:

* link:#gkusp[To access an EJB component from a stand-alone client]
* link:#gkutw[To access an EJB component from a server-side module]
* link:#gkuqa[To access a JMS resource from a stand-alone client]

For information about using the ACC, see link:#beakv[Developing Clients
Using the ACC].

[[gkusp]][[GSDVG00074]][[to-access-an-ejb-component-from-a-stand-alone-client]]

==== To access an EJB component from a stand-alone client

1. In your client code, instantiate the `InitialContext`:
+
[source,java]
----
InitialContext ctx = new InitialContext();
----
It is not necessary to explicitly instantiate a naming context that
points to the CosNaming service.
2. In the client code, look up the home object by specifying the JNDI
name of the home object.
+
Here is an EJB 2.x example:
+
[source,java]
----
Object ref = ctx.lookup("jndi-name");
BeanAHome = (BeanAHome)PortableRemoteObject.narrow(ref,BeanAHome.class);
----
Here is an EJB 3.x example:
+
[source,java]
----
BeanRemoteBusiness bean =(BeanRemoteBusiness) ctx.lookup("com.acme.BeanRemoteBusiness");
----
If load balancing is enabled as in Step link:#CIHJADHD[6] and the EJB
components being accessed are in a different cluster, the endpoint list
must be included in the lookup, as follows:
+
[source]
----
corbaname:host1:port1,host2:port2,.../NameService#ejb/jndi-name
----
For more information about naming and lookups, see
link:jndi.html#beans[Accessing the Naming Context].
3. Deploy the EJB component to be accessed.
+
For more information on deployment, see "link:../application-deployment-guide/overview.html#GSDPG00063[About
Deployment Tools]" in {productName} Application
Deployment Guide.
4. Copy the as-install``/lib/gf-client.jar`` file to the client machine
and include it in the classpath on the client side.
+
The `gf-client.jar` file references {productName} JAR files in its
`MANIFEST.MF` file. If there is no {productName} installation on the
client machine, you must also copy the as-install``/modules`` directory to
the client machine and maintain its directory structure relative to the
as-install``/lib/gf-client.jar`` file. Or you can use the
`package-appclient` script; see link:#beakz[Using the
`package-appclient` Script].
5. To access EJB components that are residing in a remote system, set
the following system properties for the Java Virtual Machine startup
options:
+
[source]
----
-Dorg.omg.CORBA.ORBInitialHost=${ORBhost}
-Dorg.omg.CORBA.ORBInitialPort=${ORBport}
----
Here ORBhost is the {productName} hostname and ORBport is the ORB
port number (default is `3700` for the default server instance, named
`server`).
+
You can use the `asadmin get` command to get the IIOP port numbers. For
example:
+
[source]
----
asadmin get "configs.config.server-config.iiop-service.iiop-listener.orb-listener-1.*"
----
6. [[CIHJADHD]]
+
To set up load balancing and remote EJB reference failover, define the
`endpoints` property as follows:
+
[source]
----
-Dcom.sun.appserv.iiop.endpoints=host1:port1,host2:port2,...
----
The `endpoints` property specifies a comma-separated list of one or more
IIOP endpoints used for load balancing. An IIOP endpoint is in the form
host`:`port, where the host is an IPv4 address or host name, and the
port specifies the port number.
+
If the `endpoints` list is changed dynamically in the code, the new list
is used only if a new `InitialContext` is created.
7. Make sure the `etc/hosts` file on the client machine maps the
{productName} hostname and external IP address.
8. Run the stand-alone client.
+
As long as the client environment is set appropriately and the JVM is
compatible, you merely need to run the `main` class.

[[gkutw]][[GSDVG00075]][[to-access-an-ejb-component-from-a-server-side-module]]

==== To access an EJB component from a server-side module

A server-side module can be a servlet, another EJB component, or another
type of module.

1. [[CIHFIJDC]]
+
In your module code, instantiate the `InitialContext`:
+
[source,java]
----
InitialContext ctx = new InitialContext();
----
It is not necessary to explicitly instantiate a naming context that
points to the CosNaming service.
+
To set up load balancing and remote EJB reference failover, define the
`endpoints` property as follows:
+
[source,java]
----
Hashtable env = new Hashtable();
env.put("com.sun.appserv.iiop.endpoints","host1:port1,host2:port2,...");
InitialContext ctx = new InitialConext(env);
----
The `endpoints` property specifies a comma-separated list of one or more
IIOP endpoints used for load balancing. An IIOP endpoint is in the form
host`:`port, where the host is an IPv4 address or host name, and the
port specifies the port number.
+
You can use the `asadmin get` command to get the IIOP port numbers. For
example:
+
[source]
----
asadmin get "configs.config.server-config.iiop-service.iiop-listener.orb-listener-1.*"
----
If the `endpoints` list is changed dynamically in the code, the new list
is used only if a new `InitialContext` is created.
2. In the module code, look up the home object by specifying the JNDI
name of the home object.
+
Here is an EJB 2.x example:
+
[source,java]
----
Object ref = ctx.lookup("jndi-name");
BeanAHome = (BeanAHome)PortableRemoteObject.narrow(ref,BeanAHome.class);
----
Here is an EJB 3.x example:
+
[source,java]
----
BeanRemoteBusiness bean =(BeanRemoteBusiness) ctx.lookup("com.acme.BeanRemoteBusiness");
----
If load balancing is enabled as in Step link:#CIHFIJDC[1] and the EJB
components being accessed are in a different cluster, the endpoint list
must be included in the lookup, as follows:
+
[source]
----
corbaname:host1:port1,host2:port2,.../NameService#ejb/jndi-name
----
For more information about naming and lookups, see
link:jndi.html#beans[Accessing the Naming Context].
3. Deploy the EJB component to be accessed.
+
For more information on deployment, see "link:../application-deployment-guide/overview.html#GSDPG00063[About
Deployment Tools]" in {productName} Application
Deployment Guide.
4. To access EJB components that are residing in a remote system, set
the following system properties for the Java Virtual Machine startup
options:
+
[source]
----
-Dorg.omg.CORBA.ORBInitialHost=${ORBhost}
-Dorg.omg.CORBA.ORBInitialPort=${ORBport}
----
Here ORBhost is the Application Server hostname and ORBport is the ORB
port number (default is `3700` for the default server instance, named `server`).
5. Deploy the module.
+
For more information on deployment, see "link:../application-deployment-guide/overview.html#GSDPG00063[About
Deployment Tools]" in {productName} Application
Deployment Guide.

[[gkuqa]][[GSDVG00076]][[to-access-a-jms-resource-from-a-stand-alone-client]]

==== To access a JMS resource from a stand-alone client

1. Create a JMS client.
+
For detailed instructions on developing a JMS client, see
https://eclipse-ee4j.github.io/jakartaee-tutorial/#jakarta-messaging-examples[
Java Message Service Examples] in The Jakarta EE Tutorial.
2. Configure a JMS resource on {productName}.
+
For information on configuring JMS resources, see
"link:../administration-guide/jms.html#GSADG00598[
Administering JMS Connection Factories and Destinations]"
in {productName} Administration Guide.
3. Copy the following JAR files to the client machine and include them
in the classpath on the client side:
* `gf-client.jar` - available at as-install``/lib``
* `imqjmsra.jar` - available at
as-install``/lib/install/aplications/jmsra``
+
The `gf-client.jar` file references {productName} JAR files in its
`MANIFEST.MF` file. If there is no {productName} installation on the
client machine, you must also copy the as-install``/modules`` directory to
the client machine and maintain its directory structure relative to the
as-install``/lib/gf-client.jar`` file. Or you can use the
`package-appclient` script; see link:#beakz[Using the
`package-appclient` Script].
4. To access EJB components that are residing in a remote system, set
the following system properties for the Java Virtual Machine startup
options:
+
[source]
----
-Dorg.omg.CORBA.ORBInitialHost=${ORBhost}
-Dorg.omg.CORBA.ORBInitialPort=${ORBport}
----
Here ORBhost is the Application Server hostname and ORBport is the ORB
port number (default is `3700` for the default server instance, named
`server`).
+
You can use the `asadmin get` command to get the IIOP port numbers. For
example:
+
[source]
----
asadmin get "configs.config.server-config.iiop-service.iiop-listener.orb-listener-1.*"
----
5. Run the stand-alone client.
+
As long as the client environment is set appropriately and the JVM is
compatible, you merely need to run the `main` class.


