---
title:  Setting Up the CLASSPATH
---

<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

This topic describes how <%=vars.product_name%> processes set their CLASSPATH.

To simplify CLASSPATH environment settings, <%=vars.product_name%> has organized all application libraries required by <%=vars.product_name%> processes into `*-dependencies.jar` files. All dependency JAR files are located in the `path_to_product/lib` directory.

When starting a server or locator process using `gfsh`,
application JAR files are automatically loaded into
the process's CLASSPATH from two directories:

- `path_to_product/lib/`
- `path_to_product/extensions/`

**Note:**
To embed <%=vars.product_name%> in your application, add `path_to_product/lib/geode-dependencies.jar` to your CLASSPATH.

The following table lists the dependency JAR files associated with various <%=vars.product_name%> processes:

<table>
<colgroup>
<col width="50%" />
<col width="50%" />
</colgroup>
<thead>
<tr class="header">
<th><%=vars.product_name%> Process</th>
<th>Associated JAR Files</th>
</tr>
</thead>
<tbody>
<tr>
<td>gfsh</td>
<td>gfsh-dependencies.jar</td>
</tr>
<tr>
<td>server and locator</td>
<td>geode-dependencies.jar
<div class="note note">
Note:
<p>Use this library for all standalone or embedded <%=vars.product_name%> processes (including Java clients) that host cache data.</p>
</div></td>
</tr>
</tbody>
</table>

## Modifying the CLASSPATH in gfsh-Managed Processes

There are two options for updating the CLASSPATH of <%=vars.product_name%> server and locator processes that are started on the gfsh command line.

**Option 1:** Specify the `--classpath` parameter upon process startup. For example, to modify the CLASSPATH of a locator:

``` pre
gfsh> start locator --name=locator1 --classpath=/path/to/applications/classes.jar
```

And to modify the CLASSPATH of a server:

``` pre
gfsh> start server --name=server1 --classpath=/path/to/applications/classes.jar
```

Application classes supplied as arguments to the `--classpath` option are *prepended* to the server or locator's CLASSPATH, beginning in second position. The first entry in the CLASSPATH is reserved for the core <%=vars.product_name%> jar file, for security reasons.

**Option 2:** Define the CLASSPATH environment variable in your OS environment. Then, specify the `--include-system-classpath` parameter upon process startup. For example:

``` pre
gfsh> start locator --name=locator1 --include-system-classpath=true
```

The same can also be done for server processes:

``` pre
gfsh> start server --name=server1 --include-system-classpath=true
```

This option *appends* the contents of the system CLASSPATH environment variable to the locator or server's CLASSPATH upon startup. Specifying this option without a value sets it to true.

## Setting the CLASSPATH for Applications and Standalone Java Processes

If you are starting a <%=vars.product_name%> process programmatically (standalone or embedded), we recommend that you specify the CLASSPATH upon program execution using the `java -classpath` or `java -cp` command-line option. This method is preferred to setting the CLASSPATH as an environment variable since it allows you to set the value individually for each application without affecting other applications and without other applications modifying its value.

For example, to start up a <%=vars.product_name%> locator process using the LocatorLauncher API, you can execute the following on the command line:

``` pre
prompt# java -cp "path_to_product/lib/geode-dependencies.jar"
org.apache.geode.distributed.LocatorLauncher start locator1
<locator-launcher-options>
```

To start up a <%=vars.product_name%> server process using the ServerLauncher API:

``` pre
prompt# java -cp "path_to_product/lib/geode-dependencies.jar:/path/to/your/applications/classes.jar"
org.apache.geode.distributed.ServerLauncher start server1
<server-launcher-options>
```

Note that in addition to the `*-dependencies.jar` file associated with the process, you must also specify any custom application JARs that you wish to access in your <%=vars.product_name%> process. For example, if you are planning on using a customized compressor on your regions, you should specify the application JAR that contains the compressor application you wish to use.

To start up an application with an embedded cache:

``` pre
java -cp "path_to_product/lib/geode-dependencies.jar:/path/to/your/applications/classes.jar"
com.mycompany.package.ApplicationWithEmbeddedCache
```

**Note:**
Another method for updating the CLASSPATH of a server process with your own applications is to use the `gfsh deploy` command. Deploying application JAR files will automatically update the CLASSPATH of all members that are targeted for deployment. See [Deploying Application JARs to <%=vars.product_name_long%> Members](../configuring/cluster_config/deploying_application_jars.html#concept_4436C021FB934EC4A330D27BD026602C) for more details.


