You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译ANTLR4 Java发行版时Maven插件测试遇空指针异常

编译ANTLR4的antlr4-maven-plugin模块时测试阶段触发NullPointerException

问题描述

尝试编译ANTLR4的Java相关模块(runtime/Java、tool、antlr4-maven-plugin),编译环节通过,但antlr4-maven-plugin的测试阶段失败,触发空指针异常。推测可能与Maven调用方式有关,未在网上找到同类问题。

环境信息

  • Java版本:
$ java -version
openjdk version "17.0.3" 2022-04-19
OpenJDK Runtime Environment Temurin-17.0.3+7 (build 17.0.3+7)
OpenJDK 64-Bit Server VM Temurin-17.0.3+7 (build 17.0.3+7, mixed mode, sharing)

注:根据POM配置,ANTLR4核心编译目标为Java 11,仅antlr4-maven-plugin插件的编译目标为Java 8

复现步骤

  • 拉取ANTLR4源码:
$ git clone https://github.com/antlr/antlr4.git antlr4_30
$ cd antlr4_30
$ git status
On branch master
Your branch is up to date with 'origin/master'.
  • 编译指定模块:
PROJECTS="runtime/Java,tool,antlr4-maven-plugin"
mvn --projects "$PROJECTS" clean
mvn --projects "$PROJECTS" verify

错误信息

测试阶段抛出NullPointerException:

java.lang.NullPointerException: Cannot invoke
"org.apache.maven.model.Plugin.getGroupId()"
because the return value of 
"org.apache.maven.plugin.MojoExecution.getPlugin()" 
is null

关键栈追踪:

org.apache.maven.lifecycle.internal.
DefaultMojoExecutionConfigurator.configure(DefaultMojoExecutionConfigurator.java:44)
(called by) io.takari.maven.testing.
            Maven331Runtime.lookupConfiguredMojo(Maven331Runtime.java:37)
(called by) io.takari.maven.testing.
            Maven325Runtime.executeMojo(Maven325Runtime.java:34)
(called by) io.takari.maven.testing.
            TestMavenRuntime.executeMojo(TestMavenRuntime.java:269)
(called by) org.antlr.mojo.antlr4.
            Antlr4MojoTest.processWhenDependencyRemoved(Antlr4MojoTest.java:326)

问题分析

  • 排查源码发现:在org.antlr.mojo.antlr4.Antlr4MojoTest类的测试用例中,通过TestMavenRuntime.newMojoExecution(goal)获取的MojoExecution实例,其getPlugin()方法返回null,而非有效的org.apache.maven.model.Plugin实例。
  • Maven的DefaultMojoExecutionConfigurator.configure()方法直接调用mojoExecution.getPlugin().getGroupId(),因此触发空指针。
  • 查看MojoExecution.getPlugin()源码:
public Plugin getPlugin()
{
    if ( mojoDescriptor != null )
    {
        return mojoDescriptor.getPluginDescriptor().getPlugin();
    }
    return plugin;
}

当前场景中mojoDescriptor非空,但mojoDescriptor.getPluginDescriptor().getPlugin()为null。已知Takari的Maven30xRuntime会调用PluginDescriptorBuilder从plugin.xml构建PluginDescriptor,但未设置plugin成员,暂不清楚该成员的正确设置位置及未被设置的原因。


内容的提问来源于stack exchange,提问作者David Tonhofer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:15:36