编译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
相关产品推荐
相关产品推荐

