<!--
/***************************************************************************************************************************
 * 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.
 ***************************************************************************************************************************/
 -->

Introduction

<p>
	Apache Juneau&trade; is a single cohesive Java ecosystem consisting of the following parts:
</p>
<table class='styled w800'>
	<tr>
		<th>Group</th><th>Component</th><th>Description</th>
	</tr>
	
	<tr class='dark bb'>
		<td rowspan="4" style='text-align:center;font-weight:bold;padding:20px;'>Juneau Core</td>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-marshall'>juneau-marshall</a></td>
		<td>
			A universal toolkit for marshalling POJOs to a wide variety of content types using a common framework with no external library dependencies.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-marshall-rdf'>juneau-marshall-rdf</a></td>
		<td>
			Extended marshalling support for RDF languages.				
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-dto'>juneau-dto</a></td>
		<td>
			A variety of predefined DTOs for serializing and parsing languages such as HTML5, Swagger and ATOM.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-config'>juneau-config</a></td>
		<td>
			A sophisticated configuration file API.
		</td>
	</tr>
	
	<tr class='light bb'>
		<td rowspan="5" style='text-align:center;font-weight:bold;padding:20px;'>Juneau REST</td>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-rest-server'>juneau-rest-server</a></td>
		<td>
			A universal REST server API for creating Swagger-based self-documenting REST interfaces using POJOs, simply deployed as 
			one or more top-level servlets in any Servlet 3.1.0+ container.
		</td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-rest-server-springboot'>juneau-rest-server-springboot</a></td>
		<td>
			Spring boot integration support.
		</td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-rest-server-jaxrs'>juneau-rest-server-jaxrs</a></td>
		<td>
			JAX/RS integration support.
		</td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-rest-client'>juneau-rest-client</a></td>
		<td>
			A universal REST client API for interacting with Juneau or 3rd-party REST interfaces using POJOs and proxy interfaces.
		</td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-rest-mock'>juneau-rest-mock</a></td>
		<td>
			Mocking APIs for server-less end-to-end testing of REST server and client APIs.
		</td>
	</tr>

	<tr class='dark bb'>
		<td rowspan="4" style='text-align:center;font-weight:bold;padding:20px;'>Examples</td>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-examples-core'>juneau-examples-core</a></td>
		<td>
			Juneau Core API examples.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-examples-rest'>juneau-examples-rest</a></td>
		<td>
			Juneau REST API examples.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-examples-rest-jetty'>juneau-examples-rest-jetty</a></td>
		<td>
			Juneau REST API examples using Jetty deployment.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-examples-rest-springboot'>juneau-examples-rest-springboot</a></td>
		<td>
			Juneau REST API examples using Spring Boot deployment.
		</td>
	</tr>

</table>
<p>
	Questions via email to <a class='doclink' href='mailto:dev@juneau.apache.org?Subject=Apache%20Juneau%20question'>dev@juneau.apache.org</a> are always welcome.
</p>
<p>
	Juneau is packed with features that may not be obvious at first.  
	Users are encouraged to ask for code reviews by providing links to specific source files such as through GitHub.
	Not only can we help you with feedback, but it helps us understand usage patterns to further improve the product.
</p>

<h5 class='topic'>History</h5>
<p>
	Juneau started off as a popular internal IBM toolkit called Juno.
	Originally used for serializing POJOs to and from JSON (at a time when the concept was new), it later expanded in 
	scope to include a variety of content types, and then later REST servlet, client, and microservice APIs.
	It's use grew to more than 50 projects and was one of the most popular community source projects within IBM.
</p>
<p>
	In June of 2016, the code was donated to the Apache Foundation under the project <l>Apache Juneau</l> where it 
	has continued to evolve to where it is today.
</p>	
