首页 > 解决方案 > 一个Maven插件失败并打开一个问题,我想解释一下遇到的NullPointerException是如何出现的

问题描述

在编译开源项目时,我遇到了一个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$8(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

为此,我将导致NullPointerExceptionGit存储库中的相关行加红。
第 441 行的内容GitCommitIdMojo.java

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(...)表达式的一部分时,它可能会在返回 null的Collections.singletonList(session.getCurrentProject())地方失败。session.getCurrentProject()

我对吗?
该语句的其他哪些部分可能NullPointerException在什么条件下导致?

标签: javanullpointerexception

解决方案


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

这是版本 4.0.3 中的第 441 行

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

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


推荐阅读