Maven3.6.3 NullPointerException排查

1,053 阅读1分钟

碰到的问题

最近加入一个新的项目,编译项目代码的时候报错,如下:

image.png

排查思路

没啥思路,直接mvnDebug吧。

image.png

如上图所示,大概原因就是在解析finalName -> ${project.build.finalName}时,查询不到对应的值,返回了null,设置到HashTable时报NPE。

问题定位

因为top-link不是项目主动引入的,所以就直接在公司内网中搜索top-link,然后发现同事已经碰到过相同的问题了,并且给出了原因,如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <properties>
    <groupId>com.taobao.top</groupId>
    <artifactId>top-link</artifactId>
    <finalName>${project.build.finalName}</finalName>
    <dateVersion></dateVersion>
  </properties>

  <groupId>${groupId}</groupId>
  <artifactId>${artifactId}</artifactId>
  <version>1.1.1${dateVersion}-SNAPSHOT</version>
  <packaging>jar</packaging>

新版本maven缺少嵌套属性识别功能,就是不支持在properties标签中同时使用${}嵌套获取值。

project.build.finalName默认会被解析为{project.artifactId}-${project.version}。

递归解析project.artifactId时发现{artifactId}中也定义了${artifactId},maven会认为这是种循环依赖,抛出异常,导致 String inter = interpolate( value ); 这句返回为null,因此出现了空指针异常。

解决方案

同事已经给maven提了issue,issues.apache.org/jira/projec…,显示已经在3.8.2, 4.0.0, 4.0.0-alpha-1版本中修复了。