////
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

    https://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.
////

== 0.3.0 (2023-03-14)

* Upgrade the compiler version to Java 17, yet still target Java 8

* Support multiple and formatting-agnostic template files (https://github.com/apache/logging-log4j-tools/issues/44[#44])

* The changelog release models passed to the index template file (`.index.adoc.ftl`) is enriched with `changelogEntryCount` fields (https://github.com/apache/logging-log4j-tools/issues/37[#37])

== 0.2.0 (2023-01-31)

* Fixed Windows compatibility (https://github.com/apache/logging-log4j-tools/issues/19[#19])

* Fixed unreleased directory order in `ChangelogExporter` (https://github.com/apache/logging-log4j-tools/issues/17[#17])

* Removed `security` as a change type from `log4j-changelog` (https://github.com/apache/logging-log4j-tools/issues/14[#14])

* Added XSD for `log4j-changelog` XML files (https://github.com/apache/logging-log4j-tools/issues/13[#13])

* Added `log4j-changelog-maven-plugin` module and renamed `log4j.changelog.exporter.outputDirectory` property to `log4j.changelog.outputDirectory` (https://github.com/apache/logging-log4j-tools/issues/20[#20])

== 0.1.0 (2023-01-10)

* Added `log4j-tools-bom` and `log4j-changelog` modules (https://issues.apache.org/jira/browse/LOG4J2-3628[LOG4J2-3628])
