您可以在支持Gradle的IDE中打开此示例。

此示例展示了如何通过 Problems API 发出问题以及 IDE 端如何消费这些报告。请访问用户手册了解更多关于Problems API的信息。

运行示例

要运行示例,请执行 ./gradlew :sample-ide:importBuild 命令。

项目结构

该示例由多个独立的构建组成,这些构建以以下布局组合成一个复合构建:

  • sample-project: 一个包含报告问题的插件的 Gradle 构建

  • sample-ide: 一个模拟 IDE 功能的项目。换句话说,它使用 Gradle Tooling API 配置和运行 sample-project 构建,并打印在此过程中收到的问题报告。

  • reporters/standard-plugin 展示了 Problems API 在标准 Gradle 插件中的用法。

  • reporters/model-builder-plugin 展示了如何在使用 Tooling API 读取项目配置时使用 Problems API 报告问题。

  • reporters/script-plugin 展示了 Problems API 在预编译脚本插件中的用法。

发出问题

问题可以通过注入的 Problems 服务发出。以下是报告插件中问题的示例,包括添加自定义附加数据:

reporters/standard-plugin/src/main/java/reporters/StandardPlugin.java
ProblemId problemId = ProblemId.create("adhoc-plugin-deprecation", "Plugin is deprecated", PROBLEM_GROUP);
problems.getReporter().report(problemId, problem -> problem
        .contextualLabel("The 'standard-plugin' is deprecated")
        .documentedAt("https://github.com/gradle/gradle/README.md")
        .severity(Severity.WARNING)
        .solution("Please use a more recent plugin version")
        .additionalData(SomeAdditionalData.class, additionalData -> {
            additionalData.setName("Some name");
            additionalData.setNames(java.util.Arrays.asList("name1", "name2"));
        })
);

接收问题报告

问题作为 Tooling API 进度事件发出。可以通过注册 ProgressListener 来处理它们:

sample-ide/src/main/java/org/gradle/sample/SampleIde.java
@Override
public void statusChanged(ProgressEvent progressEvent) {
    if (progressEvent instanceof SingleProblemEvent) {
        prettyPrint((SingleProblemEvent) progressEvent);
    } else if (progressEvent instanceof ProblemSummariesEvent) {
        prettyPrint((ProblemSummariesEvent) progressEvent);
    }
}

接收自定义附加数据

要在 Tooling API 端读取自定义附加数据,您需要一个视图类型

视图类型表示您希望通过其访问底层数据的接口或类。API 将返回此类型的实现,该实现提供数据的特定“视图”,允许对底层数据进行类型安全的访问。视图类型必须与实际数据结构兼容。

您的视图类型可以根据以下规则包含各种属性:

  • 简单类型(StringIntegerBoolean 等)

  • 集合(ListSetMap

  • 由上述类型组成的复合类型

  • Gradle Provider API 类型,它们会自动映射到其相应的类型

另请参阅 CustomAdditionalData 以获取更多信息。

视图类型可用于检索存储在问题实例中的附加数据:

sample-ide/src/main/java/org/gradle/sample/SampleIde.java
interface SomeDataView {
    String getName();

    List<String> getNames();
}

视图类型可用于检索存储在问题实例中的附加数据:

sample-ide/src/main/java/org/gradle/sample/SampleIde.java
AdditionalData data = problem.getAdditionalData();
if (data instanceof CustomAdditionalData) {
    System.out.println(" - additional data: " + ((CustomAdditionalData) data).get(SomeDataView.class).getName());
}