Jetty Logo
Version: 9.2.2-SNAPSHOT
Contact the core Jetty developers at www.webtide.com

private support for your internal/customer projects ... custom extensions and distributions ... versioned snapshots for indefinite support ... scalability guidance for your apps and Ajax/Comet projects ... development services from 1 day to full product delivery

Managing Jetty Base and Jetty Home

Demo-Base in the Jetty Distribution
Declaring Jetty Base

Starting with Jetty 9.1, it is now possible to maintain a separation between the binary installation of the standalone Jetty (known as ${jetty.home}), and the customizations for your specific environment (known as ${jetty.base}).

Jetty Base

Also known as the ${jetty.base} property

This is the location for your configurations and customizations to the Jetty distribution.

Jetty Home

Also known as the ${jetty.home} property.

This is the location for the Jetty distribution binaries, default XML IoC configurations, and default module definitions.

Potential configuration is resolved from these 2 directory locations.

Configuration Resolution Rules

Check Jetty Base

If the referenced configuration exists, relative to the defined Jetty Base, use it.

Check Jetty Home

If the referenced configuration exists, relative to the defined Jetty Home, use it.

Use java.io.File(String pathname) Logic

Lastly, use the reference as a java.io.File(String pathname) reference, following the default resolution rules outlined by that constructor.

In brief, the reference will be used as-is, be it relative (to current working directory, aka ${user.dir}) or absolute path, or even network reference (such as on Windows and use of UNC paths).

For more details on how startup with start.jar works, see Using start.jar: Executing

Demo-Base in the Jetty Distribution

The Jetty Distribution comes with an example ${jetty.base} which enables the various demonstration webapps and server configurations.

How to use the demo-base directory as a Jetty Base directory.

[jetty-distribution-9.2.2-SNAPSHOT]$ ls -la
total 496
drwxrwxr-x 11 user group   4096 Oct  8 15:23 ./
drwxr-xr-x 14 user group   4096 Oct  8 13:04 ../
drwxrwxr-x  2 user group   4096 Oct  8 06:54 bin/
drwxrwxr-x  6 user group   4096 Oct  8 06:54 demo-base/
drwxrwxr-x  2 user group   4096 Oct 11 15:14 etc/
drwxrwxr-x 11 user group   4096 Oct  8 06:54 lib/
-rw-rw-r--  1 user group  30012 Sep 30 19:55 license-eplv10-aslv20.html
drwxrwxr-x  2 user group   4096 Oct  8 06:54 logs/
drwxrwxr-x  2 user group   4096 Oct  8 06:54 modules/
-rw-rw-r--  1 user group   6262 Sep 30 19:55 notice.html
-rw-rw-r--  1 user group   1249 Sep 30 19:55 README.TXT
drwxrwxr-x  2 user group   4096 Oct  8 06:54 resources/
drwxrwxr-x  2 user group   4096 Oct  8 06:54 start.d/
-rw-rw-r--  1 user group   1780 Sep 30 19:55 start.ini
-rw-rw-r--  1 user group  71921 Sep 30 19:55 start.jar
-rw-rw-r--  1 user group 336468 Sep 30 19:55 VERSION.txt
drwxrwxr-x  2 user group   4096 Oct  8 06:54 webapps/
[jetty-distribution-9.2.2-SNAPSHOT]$ cd demo-base
[demo-base]$ java -jar ../start.jar
2013-10-16 09:08:47.800:WARN::main: demo test-realm is deployed. DO NOT USE IN PRODUCTION!
2013-10-16 09:08:47.802:INFO:oejs.Server:main: jetty-${project.version}
2013-10-16 09:08:47.817:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:/home/user/jetty-distribution-9.2.2-SNAPSHOT/demo-base/webapps/] at interval 1
2013-10-16 09:08:48.072:WARN::main: async-rest webapp is deployed. DO NOT USE IN PRODUCTION!
...

As you can see above, you are executing the demo-base configuration using the Jetty Base concepts.

If you want to see what the Jetty Base looks like without executing Jetty, you can simply list the configuration

[my-base]$ java -jar ../start.jar --list-config

Java Environment:
-----------------
 java.home=/usr/lib/jvm/jdk-7u21-x64/jre
 java.vm.vendor=Oracle Corporation
 java.vm.version=23.21-b01
 java.vm.name=Java HotSpot(TM) 64-Bit Server VM
 java.vm.info=mixed mode
 java.runtime.name=Java(TM) SE Runtime Environment
 java.runtime.version=1.7.0_21-b11
 java.io.tmpdir=/tmp

Jetty Environment:
-----------------
 jetty.home=/home/user/jetty-distribution-9.1.0-DEMO
 jetty.base=/home/user/jetty-distribution-9.1.0-DEMO/demo-base
 jetty.version=9.1.0-DEMO

JVM Arguments:
--------------
 (no jvm args specified)

System Properties:
------------------
 jetty.base = /home/user/jetty-distribution-9.1.0-DEMO/demo-base
 jetty.home = /home/user/jetty-distribution-9.1.0-DEMO

Properties:
-----------
 demo.realm = etc/realm.properties
 https.port = 8443
 https.timeout = 30000
 jaas.login.conf = etc/login.conf
 jetty.dump.start = false
 jetty.dump.stop = false
 jetty.keymanager.password = OBF:1u2u1wml1z7s1z7a1wnl1u2g
 jetty.keystore = etc/keystore
 jetty.keystore.password = OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
 jetty.port = 8080
 jetty.secure.port = 8443
 jetty.truststore = etc/keystore
 jetty.truststore.password = OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
 org.eclipse.jetty.websocket.jsr356 = false
 threads.max = 200
 threads.min = 10
 threads.timeout = 60000

Jetty Server Classpath:
-----------------------
Version Information on 42 entries in the classpath.
Note: order presented here is how they would appear on the classpath.
      changes to the --module=name command line options will be reflected here.
 0:               9.1.0-DEMO | ${jetty.home}/lib/jetty-client-9.1.0-DEMO.jar
 1:      1.4.1.v201005082020 | ${jetty.base}/lib/ext/javax.mail.glassfish-1.4.1.v201005082020.jar
 2:               9.1.0-DEMO | ${jetty.base}/lib/ext/test-mock-resources-9.1.0-DEMO.jar
 3:                    (dir) | ${jetty.home}/resources
 4:                    3.1.0 | ${jetty.home}/lib/servlet-api-3.1.jar
 5:                  3.1.RC0 | ${jetty.home}/lib/jetty-schemas-3.1.jar
 6:               9.1.0-DEMO | ${jetty.home}/lib/jetty-http-9.1.0-DEMO.jar
 7:               9.1.0-DEMO | ${jetty.home}/lib/jetty-continuation-9.1.0-DEMO.jar
 8:               9.1.0-DEMO | ${jetty.home}/lib/jetty-server-9.1.0-DEMO.jar
 9:               9.1.0-DEMO | ${jetty.home}/lib/jetty-xml-9.1.0-DEMO.jar
10:               9.1.0-DEMO | ${jetty.home}/lib/jetty-util-9.1.0-DEMO.jar
11:               9.1.0-DEMO | ${jetty.home}/lib/jetty-io-9.1.0-DEMO.jar
12:               9.1.0-DEMO | ${jetty.home}/lib/jetty-jaas-9.1.0-DEMO.jar
13:               9.1.0-DEMO | ${jetty.home}/lib/jetty-jndi-9.1.0-DEMO.jar
14:      1.1.0.v201105071233 | ${jetty.home}/lib/jndi/javax.activation-1.1.0.v201105071233.jar
15:      1.4.1.v201005082020 | ${jetty.home}/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar
16:                      1.2 | ${jetty.home}/lib/jndi/javax.transaction-api-1.2.jar
17:               9.1.0-DEMO | ${jetty.home}/lib/jetty-rewrite-9.1.0-DEMO.jar
18:               9.1.0-DEMO | ${jetty.home}/lib/jetty-security-9.1.0-DEMO.jar
19:               9.1.0-DEMO | ${jetty.home}/lib/jetty-servlet-9.1.0-DEMO.jar
20:                    3.0.0 | ${jetty.home}/lib/jsp/javax.el-3.0.0.jar
21:      1.2.0.v201105211821 | ${jetty.home}/lib/jsp/javax.servlet.jsp.jstl-1.2.0.v201105211821.jar
22:                    2.3.2 | ${jetty.home}/lib/jsp/javax.servlet.jsp-2.3.2.jar
23:                    2.3.1 | ${jetty.home}/lib/jsp/javax.servlet.jsp-api-2.3.1.jar
24:                    2.3.3 | ${jetty.home}/lib/jsp/jetty-jsp-jdt-2.3.3.jar
25:      1.2.0.v201112081803 | ${jetty.home}/lib/jsp/org.apache.taglibs.standard.glassfish-1.2.0.v201112081803.jar
26:   3.8.2.v20130121-145325 | ${jetty.home}/lib/jsp/org.eclipse.jdt.core-3.8.2.v20130121.jar
27:               9.1.0-DEMO | ${jetty.home}/lib/jetty-plus-9.1.0-DEMO.jar
28:               9.1.0-DEMO | ${jetty.home}/lib/jetty-webapp-9.1.0-DEMO.jar
29:               9.1.0-DEMO | ${jetty.home}/lib/jetty-annotations-9.1.0-DEMO.jar
30:                      4.1 | ${jetty.home}/lib/annotations/asm-4.1.jar
31:                      4.1 | ${jetty.home}/lib/annotations/asm-commons-4.1.jar
32:                      1.2 | ${jetty.home}/lib/annotations/javax.annotation-api-1.2.jar
33:               9.1.0-DEMO | ${jetty.home}/lib/jetty-deploy-9.1.0-DEMO.jar
34:                      1.0 | ${jetty.home}/lib/websocket/javax.websocket-api-1.0.jar
35:               9.1.0-DEMO | ${jetty.home}/lib/websocket/javax-websocket-client-impl-9.1.0-DEMO.jar
36:               9.1.0-DEMO | ${jetty.home}/lib/websocket/javax-websocket-server-impl-9.1.0-DEMO.jar
37:               9.1.0-DEMO | ${jetty.home}/lib/websocket/websocket-api-9.1.0-DEMO.jar
38:               9.1.0-DEMO | ${jetty.home}/lib/websocket/websocket-client-9.1.0-DEMO.jar
39:               9.1.0-DEMO | ${jetty.home}/lib/websocket/websocket-common-9.1.0-DEMO.jar
40:               9.1.0-DEMO | ${jetty.home}/lib/websocket/websocket-server-9.1.0-DEMO.jar
41:               9.1.0-DEMO | ${jetty.home}/lib/websocket/websocket-servlet-9.1.0-DEMO.jar

Jetty Active XMLs:
------------------
 ${jetty.home}/etc/jetty.xml
 ${jetty.home}/etc/jetty-http.xml
 ${jetty.home}/etc/jetty-jaas.xml
 ${jetty.home}/etc/jetty-rewrite.xml
 ${jetty.home}/etc/jetty-ssl.xml
 ${jetty.home}/etc/jetty-https.xml
 ${jetty.home}/etc/jetty-plus.xml
 ${jetty.home}/etc/jetty-annotations.xml
 ${jetty.home}/etc/jetty-deploy.xml
 ${jetty.base}/etc/demo-rewrite-rules.xml
 ${jetty.base}/etc/test-realm.xml

This demonstrates the powerful --list-config command line option and how you can use it to see what the configuration will look like when starting Jetty. From the Java environment, to the system properties, to the classpath, and finally the Active Jetty IoC XML used to build up your Jetty server configuration.

Of note, is that the output will make it known where the configuration elements came from, be it in either in ${jetty.home} or ${jetty.base}.

If you look at the ${jetty.base}/start.ini you will see something like the following.

[my-base]$ cat start.ini
# Enable security via jaas, and configure it
--module=jaas
jaas.login.conf=etc/login.conf

# Enable rewrite examples
--module=rewrite
etc/demo-rewrite-rules.xml

# Websocket chat examples needs websocket enabled
# Don't start for all contexts (set to true in test.xml context)
org.eclipse.jetty.websocket.jsr356=false
--module=websocket

# Create and configure the test realm
etc/test-realm.xml
demo.realm=etc/realm.properties

# Initialize module server
--module=server
threads.min=10
threads.max=200
threads.timeout=60000
jetty.dump.start=false
jetty.dump.stop=false

--module=deploy
--module=jsp
--module=ext
--module=resources
--module=client
--module=annotations

The ${jetty.base}/start.ini is the main startup configuration entry point for Jetty. In this example you will see that we are enabling a few modules for Jetty, specifying some properties, and also referencing some Jetty IoC XML files (namely the etc/demo-rewrite-rules.xml and etc/test-realm.xml files)

When Jetty's start.jar resolves the entries in the start.ini, it will follow the resolution rules above.

For example, the reference to etc/demo-rewrite-rules.xml was found in ${jetty.base}/etc/demo-rewrite-rules.xml.

Declaring Jetty Base

The Jetty Distribution's start.jar is the component that manages the behavior of this separation.

The Jetty start.jar and XML files always assume that both ${jetty.home} and ${jetty.base} are defined when starting Jetty.

You can opt to manually define the ${jetty.home} and ${jetty.base} directories, such as this:

[jetty-distribution-9.2.2-SNAPSHOT]$ pwd
/home/user/jetty-distribution-9.2.2-SNAPSHOT
[jetty-distribution-9.2.2-SNAPSHOT]$ java -jar start.jar \
    jetty.home=/home/user/jetty-distribution-9.2.2-SNAPSHOT \
    jetty.base=/home/user/my-base
2013-10-16 09:08:47.802:INFO:oejs.Server:main: jetty-${project.version}
2013-10-16 09:08:47.817:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:/home/user/my-base/webapps/] at interval 1
...

Or you can declare one directory and let the other one be discovered.

The following example uses default discovery of ${jetty.home} by using the parent directory of wherever start.jar itself is, and a manual declaration of ${jetty.base}.

[jetty-distribution-9.2.2-SNAPSHOT]$ pwd
/home/user/jetty-distribution-9.2.2-SNAPSHOT
[jetty-distribution-9.2.2-SNAPSHOT]$ java -jar start.jar jetty.base=/home/user/my-base
2013-10-16 09:08:47.802:INFO:oejs.Server:main: jetty-${project.version}
2013-10-16 09:08:47.817:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:/home/user/my-base/webapps/] at interval 1
...

But Jetty recommends that you always start Jetty by sitting in the directory that is your ${jetty.base} and starting Jetty by referencing the start.jar remotely.

The following demonstrates this by allowing default discovery of ${jetty.home} via locating the start.jar, and using the user.dir System Property for ${jetty.base}.

[jetty-distribution-9.2.2-SNAPSHOT]$ pwd
/home/user/jetty-distribution-9.2.2-SNAPSHOT
[jetty-distribution-9.2.2-SNAPSHOT]$ cd /home/user/my-base
[my-base]$ java -jar /home/user/jetty-distribution-9.2.2-SNAPSHOT/start.jar
2013-10-16 09:08:47.802:INFO:oejs.Server:main: jetty-${project.version}
2013-10-16 09:08:47.817:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:/home/user/my-base/webapps/] at interval 1
...

Important

Be aware of the user.dir system property, it can only be safely set when the JVM starts, and many 3rd party libraries (especially logging) use this system property.

It is strongly recommended that you sit in the directory that is your desired ${jetty.base} when starting Jetty to have consistent behavior and use of the user.dir system property.

See an error or something missing? Contribute to this documentation at Github!(Generated: 2014-07-27T01:00:23-07:00)