diff options
author | Ignat Beresnev <ignat.beresnev@jetbrains.com> | 2023-01-10 13:14:43 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-10 13:14:43 +0100 |
commit | 7544a215fb580ae0c47d1f397334f150d1a1ec65 (patch) | |
tree | a30aa62c827e3ba88a498a7406ac57fa7334b270 /docs/topics/runners/dokka-maven.md | |
parent | 2161c397e1b1aadcf3d39c8518258e9bdb2b431a (diff) | |
download | dokka-7544a215fb580ae0c47d1f397334f150d1a1ec65.tar.gz dokka-7544a215fb580ae0c47d1f397334f150d1a1ec65.tar.bz2 dokka-7544a215fb580ae0c47d1f397334f150d1a1ec65.zip |
Revise documentation (#2728)
Co-authored-by: Sarah Haggarty <sarahhaggarty@users.noreply.github.com>
Diffstat (limited to 'docs/topics/runners/dokka-maven.md')
-rw-r--r-- | docs/topics/runners/dokka-maven.md | 646 |
1 files changed, 646 insertions, 0 deletions
diff --git a/docs/topics/runners/dokka-maven.md b/docs/topics/runners/dokka-maven.md new file mode 100644 index 00000000..9bedc517 --- /dev/null +++ b/docs/topics/runners/dokka-maven.md @@ -0,0 +1,646 @@ +[//]: # (title: Maven) + +To generate documentation for a Maven-based project, you can use the Maven plugin for Dokka. + +> Compared to the [Gradle plugin for Dokka](dokka-gradle.md), the Maven plugin has only basic features and +> does not provide support for multi-module builds. +> +{type="note"} + +You can play around with Dokka and see how it can be configured for a Maven project by visiting +our [Maven example](https://github.com/Kotlin/dokka/tree/%dokkaVersion%/examples/maven) project. + +## Apply Dokka + +To apply Dokka, you need to add `dokka-maven-plugin` to the `plugins` section of your POM file: + +```xml +<build> + <plugins> + <plugin> + <groupId>org.jetbrains.dokka</groupId> + <artifactId>dokka-maven-plugin</artifactId> + <version>%dokkaVersion%</version> + <executions> + <execution> + <phase>pre-site</phase> + <goals> + <goal>dokka</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> +</build> +``` + +## Generate documentation + +The following goals are provided by the Maven plugin: + +### Stable + +| **Goal** | **Description** | +|---------------|----------------------------------------------------------------------------------------| +| `dokka:dokka` | Generates documentation with Dokka plugins applied. [HTML](dokka-html.md) format by default. | + +### Experimental + +| **Goal** | **Description** | +|--------------------|---------------------------------------------------------------------------------------------| +| `dokka:javadoc` | Generates documentation in [Javadoc](dokka-javadoc.md) format. | +| `dokka:javadocJar` | Generates a `javadoc.jar` file that contains documentation in [Javadoc](dokka-javadoc.md) format. | + +### Other output formats + +By default, the Maven plugin for Dokka builds documentation in [HTML](dokka-html.md) output format. + +All other output formats are implemented as [Dokka plugins](dokka-plugins.md). In order to generate documentation in the +desired format, you have to add it as a Dokka plugin to the configuration. + +For example, to use the experimental [GFM](dokka-markdown.md#gfm) format, you have to add `gfm-plugin` artifact: + +```xml +<plugin> + <groupId>org.jetbrains.dokka</groupId> + <artifactId>dokka-maven-plugin</artifactId> + ... + <configuration> + <dokkaPlugins> + <plugin> + <groupId>org.jetbrains.dokka</groupId> + <artifactId>gfm-plugin</artifactId> + <version>%dokkaVersion%</version> + </plugin> + </dokkaPlugins> + </configuration> +</plugin> +``` + +With this configuration, running the `dokka:dokka` goal produces documentation in GFM format. + +To learn more about Dokka plugins, see [Dokka plugins](dokka-plugins.md). + +## Build javadoc.jar + +If you want to publish your library to a repository, you may need to provide a `javadoc.jar` file that contains +API reference documentation of your library. + +For example, if you want to publish to [Maven Central](https://central.sonatype.org/), you +[must](https://central.sonatype.org/publish/requirements/) supply a `javadoc.jar` alongside your project. However, +not all repositories have that rule. + +Unlike the [Gradle plugin for Dokka](dokka-gradle.md#build-javadoc-jar), the Maven plugin comes with a ready-to-use `dokka:javadocJar` +goal. By default, it generates documentation in [Javadoc](dokka-javadoc.md) output format in the`target` folder. + +If you are not satisfied with the built-in goal or want to customize the output (for example, you want to generate +documentation in [HTML](dokka-html.md) format instead of Javadoc), similar behavior can be achieved by adding the +Maven JAR plugin with the following configuration: + +```xml +<plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>3.3.0</version> + <executions> + <execution> + <goals> + <goal>test-jar</goal> + </goals> + </execution> + <execution> + <id>dokka-jar</id> + <phase>package</phase> + <goals> + <goal>jar</goal> + </goals> + <configuration> + <classifier>dokka</classifier> + <classesDirectory>${project.build.directory}/dokka</classesDirectory> + <skipIfEmpty>true</skipIfEmpty> + </configuration> + </execution> + </executions> +</plugin> +``` + +The documentation and the `.jar` archive for it are then generated by running `dokka:dokka` and `jar:jar@dokka-jar` goals: + +```Bash +mvn dokka:dokka jar:jar@dokka-jar +``` + +> If you publish your library to Maven Central, you can use services like [javadoc.io](https://javadoc.io/) to +> host your library's API documentation for free and without any setup. It takes documentation pages straight +> from the `javadoc.jar`. It works well with the HTML format as demonstrated in +> [this example](https://javadoc.io/doc/com.trib3/server/latest/index.html). +> +{type="tip"} + +## Configuration example + +Maven's plugin configuration block can be used to configure Dokka. + +Here is an example of a basic configuration that only changes the output location of your documentation: + +```xml +<plugin> + <groupId>org.jetbrains.dokka</groupId> + <artifactId>dokka-maven-plugin</artifactId> + ... + <configuration> + <outputDir>${project.basedir}/target/documentation/dokka</outputDir> + </configuration> +</plugin> +``` + +## Configuration options + +Dokka has many configuration options to tailor your and your reader's experience. + +Below are some examples and detailed descriptions for each configuration section. You can also find an example +with [all configuration options](#complete-configuration) applied at the bottom of the page. + +### General configuration + +```xml +<plugin> + <groupId>org.jetbrains.dokka</groupId> + <artifactId>dokka-maven-plugin</artifactId> + <!-- ... --> + <configuration> + <skip>false</skip> + <moduleName>${project.artifactId}</moduleName> + <outputDir>${project.basedir}/target/documentation</outputDir> + <failOnWarning>false</failOnWarning> + <suppressObviousFunctions>true</suppressObviousFunctions> + <suppressInheritedMembers>false</suppressInheritedMembers> + <offlineMode>false</offlineMode> + <sourceDirectories> + <dir>${project.basedir}/src</dir> + </sourceDirectories> + <documentedVisibilities> + <visibility>PUBLIC</visibility> + <visibility>PROTECTED</visibility> + </documentedVisibilities> + <reportUndocumented>false</reportUndocumented> + <skipDeprecated>false</skipDeprecated> + <skipEmptyPackages>true</skipEmptyPackages> + <suppressedFiles> + <file>/path/to/dir</file> + <file>/path/to/file</file> + </suppressedFiles> + <jdkVersion>8</jdkVersion> + <languageVersion>1.7</languageVersion> + <apiVersion>1.7</apiVersion> + <noStdlibLink>false</noStdlibLink> + <noJdkLink>false</noJdkLink> + <includes> + <include>packages.md</include> + <include>extra.md</include> + </includes> + <classpath>${project.compileClasspathElements}</classpath> + <samples> + <dir>${project.basedir}/samples</dir> + </samples> + <sourceLinks> + <!-- Separate section --> + </sourceLinks> + <externalDocumentationLinks> + <!-- Separate section --> + </externalDocumentationLinks> + <perPackageOptions> + <!-- Separate section --> + </perPackageOptions> + </configuration> +</plugin> +``` + +<deflist collapsible="true"> + <def title="skip"> + <p>Whether to skip documentation generation.</p> + <p>Default: <code>false</code></p> + </def> + <def title="moduleName"> + <p>The display name used to refer to the project/module. It's used for the table of contents, navigation, logging, etc.</p> + <p>Default: <code>{project.artifactId}</code></p> + </def> + <def title="outputDir"> + <p>The directory to where documentation is generated, regardless of format.</p> + <p>Default: <code>{project.basedir}/target/dokka</code></p> + </def> + <def title="failOnWarning"> + <p> + Whether to fail documentation generation if Dokka has emitted a warning or an error. The process waits until + all errors and warnings have been emitted first. + </p> + <p>This setting works well with <code>reportUndocumented</code>.</p> + <p>Default: <code>false</code></p> + </def> + <def title="suppressObviousFunctions"> + <p>Whether to suppress obvious functions.</p> + <p> + A function is considered to be obvious if it is: + <list> + <li> + Inherited from <code>kotlin.Any</code>, <code>Kotlin.Enum</code>, <code>java.lang.Object</code> or + <code>java.lang.Enum</code>, such as <code>equals</code>, <code>hashCode</code>, <code>toString</code>. + </li> + <li> + Synthetic (generated by the compiler) and does not have any documentation, such as + <code>dataClass.componentN</code> or <code>dataClass.copy</code>. + </li> + </list> + </p> + <p>Default: <code>true</code></p> + </def> + <def title="suppressInheritedMembers"> + <p>Whether to suppress inherited members that aren't explicitly overridden in a given class.</p> + <p> + Note: This can suppress functions such as <code>equals</code>/<code>hashCode</code>/<code>toString</code>, + but cannot suppress synthetic functions such as <code>dataClass.componentN</code> and + <code>dataClass.copy</code>. Use <code>suppressObviousFunctions</code> for that. + </p> + <p>Default: <code>false</code></p> + </def> + <def title="offlineMode"> + <p>Whether to resolve remote files/links over your network.</p> + <p> + This includes package-lists used for generating external documentation links. + For example, to make classes from the standard library clickable. + </p> + <p> + Setting this to <code>true</code> can significantly speed up build times in certain cases, + but can also worsen documentation quality and user experience. For example, by + not resolving class/member links from your dependencies, including the standard library. + </p> + <p> + Note: You can cache fetched files locally and provide them to + Dokka as local paths. See <code>externalDocumentationLinks</code> section. + </p> + <p>Default: <code>false</code></p> + </def> + <def title="sourceDirectories"> + <p> + The source code roots to be analyzed and documented. + Acceptable inputs are directories and individual <code>.kt</code> / <code>.java</code> files. + </p> + <p>Default: <code>{project.compileSourceRoots}</code></p> + </def> + <def title="documentedVisibilities"> + <p>The set of visibility modifiers that should be documented.</p> + <p> + This can be used if you want to document protected/internal/private declarations, + as well as if you want to exclude public declarations and only document internal API. + </p> + <p>Can be configured on per-package basis.</p> + <p>Default: <code>PUBLIC</code></p> + </def> + <def title="reportUndocumented"> + <p> + Whether to emit warnings about visible undocumented declarations, that is declarations without KDocs + after they have been filtered by <code>documentedVisibilities</code> and other filters. + </p> + <p>This setting works well with <code>failOnWarning</code>.</p> + <p>This can be overridden at package level.</p> + <p>Default: <code>false</code></p> + </def> + <def title="skipDeprecated"> + <p>Whether to document declarations annotated with <code>@Deprecated</code>.</p> + <p>This can be overridden at package level.</p> + <p>Default: <code>false</code></p> + </def> + <def title="skipEmptyPackages"> + <p> + Whether to skip packages that contain no visible declarations after + various filters have been applied. + </p> + <p> + For example, if <code>skipDeprecated</code> is set to <code>true</code> and your package contains only + deprecated declarations, it is considered to be empty. + </p> + <p>Default: <code>true</code></p> + </def> + <def title="suppressedFiles"> + <p> + The directories or individual files that should be suppressed, meaning that declarations from them + are not documented. + </p> + </def> + <def title="jdkVersion"> + <p>The JDK version to use when generating external documentation links for Java types.</p> + <p> + For example, if you use <code>java.util.UUID</code> in some public declaration signature, + and this option is set to <code>8</code>, Dokka generates an external documentation link + to <a href="https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html">JDK 8 Javadocs</a> for it. + </p> + <p>Default: JDK 8</p> + </def> + <def title="languageVersion"> + <p> + <a href="https://kotlinlang.org/docs/compatibility-modes.html">The Kotlin language version</a> + used for setting up analysis and <a href="https://kotlinlang.org/docs/kotlin-doc.html#sample-identifier">@sample</a> + environment. + </p> + <p>By default, the latest language version available to Dokka's embedded compiler is used.</p> + </def> + <def title="apiVersion"> + <p> + <a href="https://kotlinlang.org/docs/compatibility-modes.html">The Kotlin API version</a> + used for setting up analysis and <a href="https://kotlinlang.org/docs/kotlin-doc.html#sample-identifier">@sample</a> + environment. + </p> + <p>By default, it is deduced from <code>languageVersion</code>.</p> + </def> + <def title="noStdlibLink"> + <p> + Whether to generate external documentation links that lead to the API reference + documentation of Kotlin's standard library. + </p> + <p>Note: Links <b>are</b> generated when <code>noStdLibLink</code> is set to <code>false</code>.</p> + <p>Default: <code>false</code></p> + </def> + <def title="noJdkLink"> + <p>Whether to generate external documentation links to JDK's Javadocs.</p> + <p>The version of JDK Javadocs is determined by the <code>jdkVersion</code> option.</p> + <p>Note: Links <b>are</b> generated when <code>noJdkLink</code> is set to <code>false</code>.</p> + <p>Default: <code>false</code></p> + </def> + <def title="includes"> + <p> + A list of Markdown files that contain + <a href="https://kotlinlang.org/docs/reference/kotlin-doc.html#module-and-package-documentation">module and package documentation</a> + </p> + <p>The contents of specified files are parsed and embedded into documentation as module and package descriptions.</p> + </def> + <def title="classpath"> + <p>The classpath for analysis and interactive samples.</p> + <p> + This is useful if some types that come from dependencies are not resolved/picked up automatically. + This option accepts both <code>.jar</code> and <code>.klib</code> files. + </p> + <p>Default: <code>{project.compileClasspathElements}</code></p> + </def> + <def title="samples"> + <p> + A list of directories or files that contain sample functions which are referenced via + <a href="https://kotlinlang.org/docs/kotlin-doc.html#sample-identifier">@sample KDoc tag.</a> + </p> + </def> +</deflist> + +### Source link configuration + +The `sourceLinks` configuration block allows you to add a `source` link to each signature +that leads to the `url` with a specific line number. (The line number is configurable by setting `lineSuffix`). + +This helps readers to find the source code for each declaration. + +For an example, see the documentation for the +[`count()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/count.html) +function in `kotlinx.coroutines`. + +```xml +<plugin> + <groupId>org.jetbrains.dokka</groupId> + <artifactId>dokka-maven-plugin</artifactId> + <!-- ... --> + <configuration> + <sourceLinks> + <link> + <path>${project.basedir}/src</path> + <url>https://github.com/kotlin/dokka/tree/master/src</url> + <lineSuffix>#L</lineSuffix> + </link> + </sourceLinks> + </configuration> +</plugin> +``` + +<deflist collapsible="true"> + <def title="path"> + <p> + The path to the local source directory. The path must be relative to the root of the + current module. + </p> + </def> + <def title="url"> + <p> + The URL of the source code hosting service that can be accessed by documentation readers, + like GitHub, GitLab, Bitbucket, etc. This URL is used to generate + source code links of declarations. + </p> + </def> + <def title="lineSuffix"> + <p> + The suffix used to append source code line number to the URL. This helps readers navigate not only + to the file, but to the specific line number of the declaration. + </p> + <p> + The number itself is appended to the specified suffix. For example, if this option is set + to <code>#L</code> and the line number is 10, the resulting URL suffix is <code>#L10</code>. + </p> + <p> + Suffixes used by popular services: + <list> + <li>GitHub: <code>#L</code></li> + <li>GitLab: <code>#L</code></li> + <li>Bitbucket: <code>#lines-</code></li> + </list> + </p> + </def> +</deflist> + +#### External documentation links configuration + +The `externalDocumentationLink` block allows the creation of links that lead to the externally hosted documentation of +your dependencies. + +For example, if you are using types from `kotlinx.serialization`, by default they are unclickable in your +documentation, as if they are unresolved. However, since the API reference documentation for `kotlinx.serialization` +is built by Dokka and is [published on kotlinlang.org](https://kotlinlang.org/api/kotlinx.serialization/), you can +configure external documentation links for it. Thus allowing Dokka to generate links for types from the library, making +them resolve successfully and clickable. + +By default, external documentation links for Kotlin standard library and JDK are configured. + +```xml +<plugin> + <groupId>org.jetbrains.dokka</groupId> + <artifactId>dokka-maven-plugin</artifactId> + <!-- ... --> + <configuration> + <externalDocumentationLinks> + <link> + <url>https://kotlinlang.org/api/kotlinx.serialization/</url> + <packageListUrl>file:/${project.basedir}/serialization.package.list</packageListUrl> + </link> + </externalDocumentationLinks> + </configuration> +</plugin> +``` + +<deflist collapsible="true"> + <def title="url"> + <p>The root URL of documentation to link to. It <b>must</b> contain a trailing slash.</p> + <p> + Dokka does its best to automatically find the <code>package-list</code> for the given URL, + and link declarations together. + </p> + <p> + If automatic resolution fails or if you want to use locally cached files instead, + consider setting the <code>packageListUrl</code> option. + </p> + </def> + <def title="packageListUrl"> + <p> + The exact location of a <code>package-list</code>. This is an alternative to relying on Dokka + automatically resolving it. + </p> + <p> + Package lists contain information about the documentation and the project itself, + such as module and package names. + </p> + <p>This can also be a locally cached file to avoid network calls.</p> + </def> +</deflist> + +### Package options + +The `perPackageOptions` configuration block allows setting some options for specific packages matched by `matchingRegex`. + +```xml +<plugin> + <groupId>org.jetbrains.dokka</groupId> + <artifactId>dokka-maven-plugin</artifactId> + <!-- ... --> + <configuration> + <perPackageOptions> + <packageOptions> + <matchingRegex>.*api.*</matchingRegex> + <suppress>false</suppress> + <reportUndocumented>false</reportUndocumented> + <skipDeprecated>false</skipDeprecated> + <documentedVisibilities> + <visibility>PUBLIC</visibility> + <visibility>PRIVATE</visibility> + <visibility>PROTECTED</visibility> + <visibility>INTERNAL</visibility> + <visibility>PACKAGE</visibility> + </documentedVisibilities> + </packageOptions> + </perPackageOptions> + </configuration> +</plugin> +``` + +<deflist collapsible="true"> + <def title="matchingRegex"> + <p>The regular expression that is used to match the package.</p> + <p>Default: <code>.*</code></p> + </def> + <def title="suppress"> + <p>Whether this package should be skipped when generating documentation.</p> + <p>Default: <code>false</code></p> + </def> + <def title="documentedVisibilities"> + <p>The set of visibility modifiers that should be documented.</p> + <p> + This can be used if you want to document protected/internal/private declarations within this package, + as well as if you want to exclude public declarations and only document internal API. + </p> + <p>Default: <code>PUBLIC</code></p> + </def> + <def title="skipDeprecated"> + <p>Whether to document declarations annotated with <code>@Deprecated</code>.</p> + <p>This can be set on project/module level.</p> + <p>Default: <code>false</code></p> + </def> + <def title="reportUndocumented"> + <p> + Whether to emit warnings about visible undocumented declarations, that is declarations without KDocs + after they have been filtered by <code>documentedVisibilities</code> and other filters. + </p> + <p>This setting works well with <code>failOnWarning</code>.</p> + <p>Default: <code>false</code></p> + </def> +</deflist> + +### Complete configuration + +Below you can see all the possible configuration options applied at the same time. + +```xml +<plugin> + <groupId>org.jetbrains.dokka</groupId> + <artifactId>dokka-maven-plugin</artifactId> + <!-- ... --> + <configuration> + <skip>false</skip> + <moduleName>${project.artifactId}</moduleName> + <outputDir>${project.basedir}/target/documentation</outputDir> + <failOnWarning>false</failOnWarning> + <suppressObviousFunctions>true</suppressObviousFunctions> + <suppressInheritedMembers>false</suppressInheritedMembers> + <offlineMode>false</offlineMode> + <sourceDirectories> + <dir>${project.basedir}/src</dir> + </sourceDirectories> + <documentedVisibilities> + <visibility>PUBLIC</visibility> + <visibility>PRIVATE</visibility> + <visibility>PROTECTED</visibility> + <visibility>INTERNAL</visibility> + <visibility>PACKAGE</visibility> + </documentedVisibilities> + <reportUndocumented>false</reportUndocumented> + <skipDeprecated>false</skipDeprecated> + <skipEmptyPackages>true</skipEmptyPackages> + <suppressedFiles> + <file>/path/to/dir</file> + <file>/path/to/file</file> + </suppressedFiles> + <jdkVersion>8</jdkVersion> + <languageVersion>1.7</languageVersion> + <apiVersion>1.7</apiVersion> + <noStdlibLink>false</noStdlibLink> + <noJdkLink>false</noJdkLink> + <includes> + <include>packages.md</include> + <include>extra.md</include> + </includes> + <classpath>${project.compileClasspathElements}</classpath> + <samples> + <dir>${project.basedir}/samples</dir> + </samples> + <sourceLinks> + <link> + <path>${project.basedir}/src</path> + <url>https://github.com/kotlin/dokka/tree/master/src</url> + <lineSuffix>#L</lineSuffix> + </link> + </sourceLinks> + <externalDocumentationLinks> + <link> + <url>https://kotlinlang.org/api/latest/jvm/stdlib/</url> + <packageListUrl>file:/${project.basedir}/stdlib.package.list</packageListUrl> + </link> + </externalDocumentationLinks> + <perPackageOptions> + <packageOptions> + <matchingRegex>.*api.*</matchingRegex> + <suppress>false</suppress> + <reportUndocumented>false</reportUndocumented> + <skipDeprecated>false</skipDeprecated> + <documentedVisibilities> + <visibility>PUBLIC</visibility> + <visibility>PRIVATE</visibility> + <visibility>PROTECTED</visibility> + <visibility>INTERNAL</visibility> + <visibility>PACKAGE</visibility> + </documentedVisibilities> + </packageOptions> + </perPackageOptions> + </configuration> +</plugin> +``` |