[[appendix]]
== Appendix

[[reproducible-builds]]
=== Reproducible Builds

Starting with version 5.7, JUnit 5 aims for its non-javadoc JARs to be
https://reproducible-builds.org/[reproducible].

Under identical build conditions, such as Java version, repeated builds should provide the
same output byte-for-byte.

This means that anyone can reproduce the build conditions of the artifacts on Maven
Central/Sonatype and produce the same output artifact locally, confirming that the
artifacts in the repositories were actually generated from this source code.

[[dependency-metadata]]
=== Dependency Metadata

Artifacts for final releases and milestones are deployed to {Maven_Central}, and snapshot
artifacts are deployed to Sonatype's {snapshot-repo}[snapshots repository] under
{snapshot-repo}/org/junit/[/org/junit].

[[dependency-metadata-junit-platform]]
==== JUnit Platform

* *Group ID*: `org.junit.platform`
* *Version*: `{platform-version}`
* *Artifact IDs*:
  `junit-platform-commons`::
    Common APIs and support utilities for the JUnit Platform. Any API annotated with
    `@API(status = INTERNAL)` is intended solely for usage within the JUnit framework
    itself. _Any usage of internal APIs by external parties is not supported!_
  `junit-platform-console`::
    Support for discovering and executing tests on the JUnit Platform from the console.
    See <<running-tests-console-launcher>> for details.
  `junit-platform-console-standalone`::
    An executable JAR with all dependencies included is provided in Maven Central under the
    https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console-standalone[junit-platform-console-standalone]
    directory. See <<running-tests-console-launcher>> for details.
  `junit-platform-engine`::
    Public API for test engines. See <<launcher-api-engines-custom>> for details.
  `junit-platform-jfr`::
    Provides a `LauncherDiscoveryListener` and `TestExecutionListener` for Java Flight
	Recorder events on the JUnit Platform. See <<running-tests-listeners-flight-recorder>>
	for details.
  `junit-platform-launcher`::
    Public API for configuring and launching test plans -- typically used by IDEs and
    build tools. See <<launcher-api>> for details.
  `junit-platform-reporting`::
    `TestExecutionListener` implementations that generate test reports -- typically used
    by IDEs and build tools. See <<junit-platform-reporting>> for details.
  `junit-platform-runner`::
    Runner for executing tests and test suites on the JUnit Platform in a JUnit 4
    environment. See <<running-tests-junit-platform-runner>> for details.
  `junit-platform-suite`::
    JUnit Platform Suite artifact that transitively pulls in dependencies on
    `junit-platform-suite-api` and `junit-platform-suite-engine` for simplified dependency
	management in build tools such as Gradle and Maven.
  `junit-platform-suite-api`::
    Annotations for configuring test suites on the JUnit Platform. Supported by the
    <<junit-platform-suite-engine, JUnit Platform Suite Engine>> and the
    <<running-tests-junit-platform-runner, JUnitPlatform runner>>.
  `junit-platform-suite-commons`::
    Common support utilities for executing test suites on the JUnit Platform.
  `junit-platform-suite-engine`::
    Engine that executes test suites on the JUnit Platform; only required at runtime. See
    <<junit-platform-suite-engine,JUnit Platform Suite Engine>> for details.
  `junit-platform-testkit`::
     Provides support for executing a test plan for a given `TestEngine` and then
     accessing the results via a fluent API to verify the expected results.

[[dependency-metadata-junit-jupiter]]
==== JUnit Jupiter

* *Group ID*: `org.junit.jupiter`
* *Version*: `{jupiter-version}`
* *Artifact IDs*:
  `junit-jupiter`::
    JUnit Jupiter aggregator artifact that transitively pulls in dependencies on
    `junit-jupiter-api`, `junit-jupiter-params`, and `junit-jupiter-engine` for
    simplified dependency management in build tools such as Gradle and Maven.
  `junit-jupiter-api`::
    JUnit Jupiter API for <<writing-tests,writing tests>> and <<extensions,extensions>>.
  `junit-jupiter-engine`::
    JUnit Jupiter test engine implementation; only required at runtime.
  `junit-jupiter-params`::
    Support for <<writing-tests-parameterized-tests,parameterized tests>> in JUnit Jupiter.
  `junit-jupiter-migrationsupport`::
    Support for migrating from JUnit 4 to JUnit Jupiter; only required for support for
    JUnit 4's `@Ignore` annotation and for running selected JUnit 4 rules.

[[dependency-metadata-junit-vintage]]
==== JUnit Vintage

* *Group ID*: `org.junit.vintage`
* *Version*: `{vintage-version}`
* *Artifact ID*:
  `junit-vintage-engine`::
    JUnit Vintage test engine implementation that allows one to run _vintage_ JUnit tests
    on the JUnit Platform. _Vintage_ tests include those written using JUnit 3 or JUnit 4
    APIs or tests written using testing frameworks built on those APIs.

[[dependency-metadata-junit-bom]]
==== Bill of Materials (BOM)

The _Bill of Materials_ POM provided under the following Maven coordinates can be used to
ease dependency management when referencing multiple of the above artifacts using
https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Importing_Dependencies[Maven]
or https://docs.gradle.org/current/userguide/managing_transitive_dependencies.html#sec:bom_import[Gradle].

* *Group ID*: `org.junit`
* *Artifact ID*: `junit-bom`
* *Version*: `{bom-version}`

[[dependency-metadata-dependencies]]
==== Dependencies

Most of the above artifacts have a dependency in their published Maven POMs on the
following _@API Guardian_ JAR.

* *Group ID*: `org.apiguardian`
* *Artifact ID*: `apiguardian-api`
* *Version*: `{apiguardian-version}`

In addition, most of the above artifacts have a direct or transitive dependency on the
following _OpenTest4J_ JAR.

* *Group ID*: `org.opentest4j`
* *Artifact ID*: `opentest4j`
* *Version*: `{ota4j-version}`

[[dependency-diagram]]
=== Dependency Diagram

[plantuml, component-diagram, svg]
----
skinparam {
    defaultFontName Open Sans
}

package org.junit.jupiter {
    [junit-jupiter] as jupiter
    [junit-jupiter-api] as jupiter_api
    [junit-jupiter-engine] as jupiter_engine
    [junit-jupiter-params] as jupiter_params
    [junit-jupiter-migrationsupport] as jupiter_migration_support
}

package org.junit.vintage {
    [junit-vintage-engine] as vintage_engine
}

package org.junit.platform {
    [junit-platform-commons] as commons
    [junit-platform-console] as console
    [junit-platform-engine] as engine
    [junit-platform-jfr] as jfr
    [junit-platform-launcher] as launcher
    [junit-platform-reporting] as reporting
    [junit-platform-runner] as runner
    [junit-platform-suite] as suite
    [junit-platform-suite-api] as suite_api
    [junit-platform-suite-commons] as suite_commons
    [junit-platform-suite-engine] as suite_engine
    [junit-platform-testkit] as testkit
}

package "JUnit 4" {
    [junit:junit] as junit4
}

package org.opentest4j {
    [opentest4j]
}

package org.apiguardian {
    [apiguardian-api] as apiguardian
    note bottom of apiguardian #white
        All artifacts except
        opentest4j and junit:junit
        have a dependency on this
        artifact. The edges have
        been omitted from this
        diagram for the sake of
        readability.
    endnote
}

jupiter ..> jupiter_api
jupiter ..> jupiter_params
jupiter ..> jupiter_engine

jupiter_api ....> opentest4j
jupiter_api ...> commons

jupiter_engine ...> engine
jupiter_engine ..> jupiter_api

jupiter_params ..> jupiter_api
jupiter_migration_support ..> jupiter_api
jupiter_migration_support ...> junit4

console ..> launcher
console ..> reporting

launcher ..> engine

jfr ..> launcher

engine ....> opentest4j
engine ..> commons

reporting ..> launcher

runner ..> suite_commons
runner ...> junit4

suite ..> suite_api
suite ..> suite_engine

suite_engine ..> suite_commons

suite_commons ..> launcher
suite_commons ..> suite_api

testkit ....> opentest4j
testkit ..> launcher

vintage_engine ...> engine
vintage_engine ..> junit4
----
