//  ========================================================================
//  Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
//  ========================================================================
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================

[[jetty-xml-usage]]
=== Jetty XML Usage

Jetty provides an XML-based configuration.
It is grounded in Java's Reflection API. Classes in the `java.lang.reflect` represent Java methods and classes, such that you can instantiate objects and invoke their methods based on their names and argument types.
Behind the scenes, Jetty's XML config parser translates the XML elements and attributes into Reflection calls.

[[using-jettyxml]]
==== Using `jetty.xml`

To use `jetty.xml`, specify it as a configuration file when running Jetty.

[source, java, subs="{sub-order}"]
----
 java -jar start.jar etc/jetty.xml
----

____
[NOTE]
If you start Jetty without specifying a configuration file, Jetty automatically locates and uses the default installation `jetty.xml` file.
Therefore `java -jar start.jar` is equivalent to `java -jar start.jar etc/jetty.xml` .
____

[[using-multiple-configuration-files]]
==== Using Multiple Configuration Files

You are not limited to one configuration file; you can use multiple configuration files when running Jetty, and Jetty will configure the appropriate server instance.
The ID of the server in the `<Configure>` tag specifies the instance you want to configure.
Each server ID in a configuration file creates a new server instance within the same JVM.
If you use the same ID across multiple configuration files, those configurations are all applied to the same server.

[[setting-parameters-in-configuration-files]]
==== Setting Parameters in Configuration Files

You can set parameters in configuration files either with system properties (using `<SystemProperty>`) or properties files (using `<Property>`) passed via the command line.
For example, this code in `jetty.xml` allows the port to be defined on the command line, falling back onto `8080`if the port is not specified:

[source, xml, subs="{sub-order}"]
----
  <Set name="port"><SystemProperty name="jetty.http.port" default="8080"/></Set>
----

Then you modify the port while running Jetty by using this command:

[source, java, subs="{sub-order}"]
----
 java -Djetty.http.port=8888 -jar start.jar etc/jetty.xml
----

An example of defining both system properties and properties files from the command line:

[source, java, subs="{sub-order}"]
----
 java -Djetty.http.port=8888 -jar start.jar myjetty.properties etc/jetty.xml etc/other.xml
----
