Developer Tools
- 1. Introduction
- 2.
edc-build
- 3.
autodoc
- 3.2. Merging the manifests
- 3.4. Using published manifest files (MavenCentral)
1. Introduction
We provide two Gradle plugins that could be used to simplify your build/documentation efforts.
The plugins are available on the GradlePlugins GitHub Repository:
edc-build
autodoc
2. edc-build
The plugin consists essentially of these things:
- a plugin class: extends
Plugin<Project>
from the Gradle API to hook into the Gradle task infrastructure - extensions: they are POJOs that are model classes for configuration.
- conventions: individual mutations that are applied to the project. For example, we use conventions to add some standard repositories to all projects, or to implement publishing to Snapshot Repository and MavenCentral in a generic way.
- tasks: executable Gradle tasks that perform a certain action like merging OpenAPI Specification documents.
It is important to note that a Gradle build is separated in phases, namely Initialization, Configuration and Execution (see documentation). Some of our conventions as well as other plugins have to be applied in the Configuration phase.
2.1. Usage
The plugin is published on the Gradle Plugin Portal, so it can be added to your project in the standard way suggested in the [Gradle documentation](https://docs.gradle.org/current/userguide/plugins.html.
3. autodoc
This plugin provides an automated way to generate basic documentation about extensions, plug points, SPI modules and configuration settings for every EDC extension module, which can then transformed into Markdown or HTML files, and subsequently be rendered for publication in static web content.
To achieve this, simply annotate respective elements directly in Java code:
@Extension(value = "Some supercool extension", categories = {"category1", "category2"})
public class SomeSupercoolExtension implements ServiceExtension {
// default value -> not required
@Setting(value = "Some string config property", type = "string", defaultValue = "foobar", required = false)
public static final String SOME_STRING_CONFIG_PROPERTY = "edc.some.supercool.string";
//no default value -> required
@Setting(value = "Some numeric config", type = "integer", required = true)
public static final String SOME_INT_CONFIG_PROPERTY = "edc.some.supercool.int";
// ...
}
The autodoc
plugin hooks into the Java compiler task (compileJava
) and generates a module manifest file that
contains meta information about each module. For example, it exposes all required and provided dependencies of an EDC
ServiceExtension
.
3.1. Usage
In order to use the autodoc
plugin we must follow a few simple steps. All examples use the Kotlin DSL.
3.1.1. Add the plugin to the buildscript
block of your build.gradle.kts
:
buildscript {
repositories {
maven {
url = uri("https://oss.sonatype.org/content/repositories/snapshots/")
}
}
dependencies {
classpath("org.eclipse.edc.autodoc:org.eclipse.edc.autodoc.gradle.plugin:<VERSION>>")
}
}
Please note that the repositories
configuration can be omitted, if the release version of the plugin is used or if used
in conjunction with the edc-build
plugin.
3.1.2. Apply the plugin to the project:
There are two options to apply a plugin. For multi-module builds this should be done at the root level.
- via
plugin
block:plugins { id("org.eclipse.edc.autodoc") }
- using the iterative approach, useful when applying to
allprojects
orsubprojects
:subprojects{ apply(plugin = "org.eclipse.edc.autodoc") }
3.1.3. Configure the plugin [optional]
The autodoc
plugin exposes the following configuration values:
- the
processorVersion
: tells the plugin, which version of the annotation processor module to use. Set this value if the version of the plugin and of the annotation processor diverge. If this is omitted, the plugin will use its own version. Please enter just the SemVer-compliant version string, nogroupId
orartifactName
are needed.Typically, you do not need to configure this and can safely omit it.configure<org.eclipse.edc.plugins.autodoc.AutodocExtension> { processorVersion.set("<VERSION>") }
The plugin will then generate an edc.json
file for every module/gradle project.
3.2. Merging the manifests
There is a Gradle task readily available to merge all the manifests into one large manifest.json
file. This comes in
handy when the JSON manifest is to be converted into other formats, such as Markdown, HTML, etc.
To do that, execute the following command on a shell:
./gradlew mergeManifest
By default, the merged manifests are saved to <rootProject>/build/manifest.json
. This destination file can be
configured using a task property:
// delete the merged manifest before the first merge task runs
tasks.withType<MergeManifestsTask> {
destinationFile = YOUR_MANIFEST_FILE
}
Be aware that due to the multithreaded nature of the merger task, every subproject’s edc.json
gets appended to the
destination file, so it is a good idea to delete that file before running the mergeManifest
task. Gradle can take care
of that for you though:
// delete the merged manifest before the first merge task runs
rootProject.tasks.withType<MergeManifestsTask> {
doFirst { YOUR_MANIFEST_FILE.delete() }
}
3.3. Rendering manifest files as Markdown or HTML
Manifests get created as JSON, which may not be ideal for end-user consumption. To convert them to HTML or Markdown, execute the following Gradle task:
./gradlew doc2md # or doc2html
this looks for manifest files and convert them all to either Markdown (doc2md
) or static HTML (doc2html
). Note that
if merged the manifests before (mergeManifests
), then the merged manifest file gets converted too.
The resulting *.md
or *.html
files are located next to the edc.json
file in <module-path>/build/
.
3.4. Using published manifest files (MavenCentral)
Manifest files (edc.json
) are published alongside the binary jar files, sources jar and javadoc jar to MavenCentral
for easy consumption by client projects. The manifest is published using type=json
and classifier=manifest
properties.
Client projects that want to download manifest files (e.g. for rendering static web content), simply define a Gradle dependency like this (kotlin DSL):
implementation("org.eclipse.edc:<ARTIFACT>:<VERSION>:manifest@json")
For example, for the :core:control-plane:control-plane-core
module in version 0.4.2-SNAPSHOT
, this would be:
implementation("org.eclipse.edc:control-plane-core:0.4.2-SNAPSHOT:manifest@json")
When the dependency gets resolved, the manifest file will get downloaded to the local gradle cache, typically located at
.gradle/caches/modules-2/files-2.1
. So in the example the manifest would get downloaded at
~/.gradle/caches/modules-2/files-2.1/org.eclipse.edc/control-plane-core/0.4.2-SNAPSHOT/<HASH>/control-plane-core-0.4.2-SNAPSHOT-manifest.json
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.