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

8.0.0 (TBD)

<p>
	This release primarily cleans up deprecated APIs from the 7.2.0 release.
</p>

<p>
	The project structures of the REST, Microservice, and Examples have been modified to fit new Spring Boot
	integration support.
	The structure is now as follows:
</p>
<ul>
	<li><code>juneau-rest</code>
	<ul>
		<li><code>juneau-rest-client</code>
		<li><code>juneau-rest-server</code>
		<li><code>juneau-rest-server-jaxrs</code>
		<li><code>juneau-rest-server-rdf</code>
		<li><b><code>juneau-rest-server-springboot</code></b> - New Spring Boot integration support classes. 
	</ul>
	<li><code>juneau-microservice</code>
	<ul>
		<li><b><code>juneau-microservice-core</code></b> - New.  Contains base {@link oaj.microservice.Microservice} class.
		<li><b><code>juneau-microservice-jetty</code></b> - New.  Contains new {@link oaj.microservice.jetty.JettyMicroservice} class.
		<li><b><code>juneau-my-jetty-microservice</code></b> - New.  Template starter project for Jetty-based microservices.
		<li><b><code>juneau-my-springboot-microservice</code></b> - New.  Template starter project for Spring-Boot-based microservices.
	</ul>
	<li><code>juneau-examples</code>
	<ul>
		<li><code>juneau-core</code>
		<li><b><code>juneau-microservice-rest</code></b> - Now contains only servlet example classes.  No Jetty configuration.
		<li><b><code>juneau-microservice-rest-jetty</code></b> - Servlet examples deployed using Jetty.
		<li><b><code>juneau-microservice-rest-springboot</code></b> - Servlet examples deployed using Spring Boot.
	</ul>
</ul>

<h5 class='topic w800'>juneau-svl</h5>
<ul class='spaced-list'>
	<li>
		New SVL variables:
		<ul class='doctree'>
			<li class='jc'>{@link oaj.svl.vars.SubstringVar}
			<li class='jc'>{@link oaj.svl.vars.PatternExtractVar}
			<li class='jc'>{@link oaj.svl.vars.PatternReplaceVar}
			<li class='jc'>{@link oaj.svl.vars.LenVar}
		</ul>
</ul>

<h5 class='topic w800'>juneau-config</h5>
<ul class='spaced-list'>
	<li>
		New methods for setting a system default configuration:
		<ul class='doctree'>
			<li class='jc'>{@link oaj.config.Config}
			<ul>
				<li class='jm'>{@link oaj.config.Config#getSystemDefault() getSystemDefault()}
				<li class='jm'>{@link oaj.config.Config#setSystemDefault(Config) setSystemDefault(Config)}
			</ul>
		</ul>
	<li>
		New classpath store.
		<ul class='doctree'>
			<li class='jc'>{@link oaj.config.store.ConfigClasspathStore}
		</ul>
	<li>
		New API method:
		<ul class='doctree'>
			<li class='jc'>{@link oaj.config.store.ConfigStore}
			<ul>
				<li class='jm'>{@link oaj.config.store.ConfigStore#exists(String) exists(String)}
			</ul>
		</ul>
</ul>

<h5 class='topic w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li>
		New methods on {@link oajr.RestServlet}:
		<ul class='doctree'>
			<li class='jm'>{@link oajr.RestServlet#setRestResourceResolver(RestResourceResolver) setRestResourceResolver(RestResourceResolver)}
			<li class='jm'>{@link oajr.RestServlet#getPath() getPath()}
		</ul>
	<li>
		The registered resource resolver is now used to instantiate objects of classes defined via <ja>@RestResource</ja>.
		<br>This allows for any of those instance to be injectable beans.
</ul>

<h5 class='topic w800'>juneau-rest-server-springboot</h5>
<ul class='spaced-list'>
	<li>
		New project containing classes for making it easy to use Juneau with Spring Boot.
</ul>

<h5 class='topic w800'>juneau-microservice-core</h5>
<ul class='spaced-list'>
	<li>
		New project that consist of just the core {@link oaj.microservice.Microservice} class and console support.
	<li>
		The Microservice API has been revamped to use a builder-based approach to creating microservices.
		<br>The new API is considerably more flexible in design and allows for the configuration and external
		files to be located in either the home directory or inside the jar classpath.
	<li>
		If the microservice cannot find a config file in the home directory with the same name as the jar and
		the <js>"juneau.configFile"</js> system property is not found, it will try to find any file in the home
		directory that ends with <js>".cfg"</js>.
	<li>
		New {@link oaj.microservice.MicroserviceListener} API for defining lifecycle event listeners.
	<li>
		New {@link oaj.microservice.console.ConfigCommand} class for performing config queries and updates through 
		the microservice console.
</ul>

<h5 class='topic w800'>juneau-microservice-jetty</h5>
<ul class='spaced-list'>
	<li>
		New {@link oaj.microservice.jetty.JettyMicroservice} class replaces the previous <code>RestMicroservice</code>.
</ul>

<h5 class='topic w800'>juneau-my-jetty-microservice</h5>
<ul class='spaced-list'>
	<li>
		New template starter project for Jetty-based microservices.
</ul>

<h5 class='topic w800'>juneau-my-springboot-microservice</h5>
<ul class='spaced-list'>
	<li>
		Template starter project for Spring-Boot-based microservices.
	<li>
		<code>app.json</code> and <code>Procfile</code> files for deploying examples into Heroku.
		<br>Includes instructions.
</ul>
