碰到的问题
最近加入一个新的项目,编译项目代码的时候报错,如下:
排查思路
没啥思路,直接mvnDebug吧。
如上图所示,大概原因就是在解析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版本中修复了。