////
    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.
////
== ChangeLog

=== Version 11.1

[vertical]
New Features::
[horizontal]
LOG4J2-2294::: Add release audit information to build.
LOG4J2-2298::: Add changelog to site.
LOG4J2-2293::: Add required license files to SBT output artifacts.
LOG4J2-2296::: Add sbt-site plugin and website configuration.
LOG4J2-2291::: Add Jenkins pipeline for SBT build.

[vertical]
Bug Fixes:: None.

[vertical]
Changes::
[horizontal]
LOG4J2-2290::: Update Log4j from 2.9.1 to 2.11.0.
LOG4J2-1995::: Update log4j-api-scala_2.11 from Scala 2.11.8 to 2.11.11.
LOG4J2-1996::: Update log4j-api-scala_2.12 from Scala 2.12.1 to 2.12.3.
LOG4J2-2115::: Update Log4j dependency from 2.8.1 to 2.9.1.
LOG4J2-2116::: Update log4j-api-scala_2.12 from Scala 2.12.3 to 2.12.4.

[vertical]
Removed:: None.
