Gradle创建包含子项目源代码的javadoc

fsi0uk1n  于 2022-11-14  发布在  Java
关注(0)|答案(1)|浏览(221)

我的项目结构如下:

API/
└── client/
    ├── subA/
    │   └── build.gradle
    ├── subB/
    │   └── build.gradle
    └── build.gradle

以及以下build.gradle内部客户端子项目:

task clientApiDocs(type: Javadoc) {
    source = sourceSets.main.allJava
    destinationDir = reporting.file("javadoc")
    classpath = configurations.compile
    options.tags = ["stereotype"]
    options.addStringOption('Xdoclint:none', '-quiet')
}

assemble.dependsOn(clientApiDocs)

distributions {
    main {
        contents{
            from (clientApiDocs.outputs) {
                into 'javadoc/ClientJava'
            }
        }
    }
    createStartScripts {
        applicationName = 'ClientJava'
    }
}

我的目标是将子项目subA和subB中的javadoc包含在clientApiDocs中。

b4lqfgs4

b4lqfgs41#

令人敬畏的io.freefair插件集合提供了一个名为io.freefair.aggregate-javadoc的插件,它应该能满足您的需求:
此插件将aggregateJavadoc任务添加到项目中,该任务将为项目本身及其所有子项目(应用了java插件)生成聚合的javadoc。
只需将下面的代码添加到根项目的build.gradle文件中。根据project README中的兼容性矩阵选择一个版本。

plugins {
    id 'io.freefair.aggregate-javadoc' version <version>
}

在内部,插件使用Javadoc类型的常规任务。

project.allprojects(p ->
    p.getPlugins().withType(JavaPlugin.class, jp ->
        aggregateJavadoc.configure(aj -> {
            TaskProvider<Javadoc> javadoc = p.getTasks().named(JavaPlugin.JAVADOC_TASK_NAME, Javadoc.class);

            aj.source(javadoc.map(Javadoc::getSource));

            if (aj.getClasspath() instanceof ConfigurableFileCollection) {
                ((ConfigurableFileCollection) aj.getClasspath()).from(javadoc.map(Javadoc::getClasspath));
            }
            else {
                ConfigurableFileCollection classpath = project.files();
                classpath.from(aj.getClasspath());
                classpath.from(javadoc.map(Javadoc::getClasspath));
                aj.setClasspath(classpath);
            }

            StandardJavadocDocletOptions options = (StandardJavadocDocletOptions) javadoc.get().getOptions();
            StandardJavadocDocletOptions aggregateOptions = (StandardJavadocDocletOptions) aj.getOptions();

            options.getLinks().forEach(link -> {
                if (!aggregateOptions.getLinks().contains(link)) {
                    aggregateOptions.getLinks().add(link);
                }
            });
            options.getLinksOffline().forEach(link -> {
                if (!aggregateOptions.getLinksOffline().contains(link)) {
                    aggregateOptions.getLinksOffline().add(link);
                }
            });
            options.getJFlags().forEach(jFlag -> {
                if (!aggregateOptions.getJFlags().contains(jFlag)) {
                    aggregateOptions.getJFlags().add(jFlag);
                }
            });
        })
    )
);

相关问题