一个Maven plugin fails和open issue,我想在里面解释遇到的NullPointerException是怎么出现的

A Maven plugin fails and to open an issue, I would like to explain inside how the NullPointerException encountered can appear

在编译开源项目时,我遇到一个 Maven 插件失败的问题。
我想就它的问题提出一个问题。为了帮助那些将寻求解决它的人,我想解释一下它是如何发生的。

Execution default of goal pl.project13.maven:git-commit-id-plugin:4.0.3:revision failed. (pl.project13.maven:git-commit-id-plugin:4.0.3:revision:default:initialize)

org.apache.maven.plugin.PluginExecutionException: Execution default of goal pl.project13.maven:git-commit-id-plugin:4.0.3:revision failed.
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:148)
    at org.eclipse.m2e.core.internal.embedder.MavenImpl.execute(MavenImpl.java:332)
    at org.eclipse.m2e.core.internal.embedder.MavenImpl.lambda(MavenImpl.java:1380)
    at [...]
Caused by: java.lang.NullPointerException
    at pl.project13.maven.git.GitCommitIdMojo.execute(GitCommitIdMojo.java:441)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
    ... 30 more

为此,我在其 Git 存储库中将导致 NullPointerException 的相关行红色化。
GitCommitIdMojo.javaThe content of the line 441 是:

List<MavenProject> sortedProjects =
   Optional.ofNullable(session.getProjectDependencyGraph())
       .map(graph -> graph.getSortedProjects())
       .orElseGet(() -> {
          log.warn("Maven's dependency graph is null. Assuming project is the only one executed.");
          return Collections.singletonList(session.getCurrentProject());
       });

但我对 Optional 和其他内联函数不是很熟悉。我想知道 NullPointerException 真正来自哪里。 Live没法测试,所以只能猜测。

  1. 我检查了源文件:session 是必需的属性。它不应该为空。

  2. 我相信 Optional.ofNullable(...) 保护括号内的内容,NullPointerException 不是来自这里。

  3. 但是当输入表达式的 .orElseGet(...) 部分时,它可能会在 Collections.singletonList(session.getCurrentProject()) 上失败,其中 session.getCurrentProject() 会 return null。

我说得对吗?
在什么情况下,此语句的其他哪些部分可能导致 NullPointerException

您查看的代码版本不正确。 maven-error 指的是 git-commit-id-plugin 的 4.0.3,但是您显示的代码来自 master 分支,位于 4.0.4-SNAPSHOT.

这是line 441 in version 4.0.3:

列出 sortedProjects = session.getProjectDependencyGraph().getSortedProjects();

NullPointer 可以来自这三个部分中的任何一个。