打包后-JAR包名为时间戳orSNAPSHOT

一、现象

通过maven-assembly-plugin插件打包,发现lib里有的Jar包格式为artifact-demo-1.0.SNAPSHOT.jar,而有的格式为artifact-demo-1.0.20211123.202203-4.jar

有个明显的现象是执行mvn clean package命令时,所编译的module后缀皆为SNAPSHOT。

二、跟踪

1. 查看Maven日志

1)Jar名为SNAPSHOT的关键日志

1
2
3
2021-11-23 16:18:07,621 [DEBUG] Adding dependency artifact com.xxx.xxx:xxx-client:jar:1.2.2-SNAPSHOT.
2021-11-23 16:18:07,623 [DEBUG] Adding artifact: com.xxx.xxx:xxx-client:jar:1.2.2-SNAPSHOT with file: /export/mavenRepository/repository/com/xxx/xxx/xxx-client/1.2.2-SNAPSHOT/xxx-client-1.2.2-SNAPSHOT.jar to assembly location: lib/xxx-client-1.2.2-SNAPSHOT.jar.
2021-11-23 16:18:07,623 [DEBUG] Adding file: /export/mavenRepository/repository/com/xxx/xxx/susf-client/1.2.2-SNAPSHOT/xxx-client-1.2.2-SNAPSHOT.jar to archive location: lib/xxx-client-1.2.2-SNAPSHOT.jar

2)Jar名为时间戳的关键日志

1
2
3
2021-11-23 16:18:07,621 [DEBUG] Adding dependency artifact com.xxx.xxx:xxx-client:jar:1.2.2-SNAPSHOT.
2021-11-23 16:18:07,623 [DEBUG] Adding artifact: com.xxx.xxx:xxx-client:jar:1.2.2-SNAPSHOT with file: /export/mavenRepository/repository/com/xxx/xxx/xxx-client/1.2.2-SNAPSHOT/xxx-client-1.2.2-SNAPSHOT.jar to assembly location: lib/xxx-client-1.2.2-20211123.202203-4.jar.
2021-11-23 16:18:07,623 [DEBUG] Adding file: /export/mavenRepository/repository/com/xxx/xxx/susf-client/1.2.2-SNAPSHOT/xxx-client-1.2.2-SNAPSHOT.jar to archive location: lib/xxx-client-1.2.2-20211123.202203-4.jar

结论:以上过程发生在Assembly插件执行阶段,其把本地仓库中的jar复制到指定的lib目录下。此时会有差异,有的保留了SNAPSHOT,有的替换为时间戳。

2. 调试Assembly插件

1)获取Assembly源码

1
2
$ git clone git@github.com:apache/maven-assembly-plugin.git
$ git checkout maven-assembly-plugin-2.2.1

2)入口方法:org.apache.maven.plugin.assembly.archive.task.AddArtifactTask#execute

1
2
3
4
5
6
7
8
9
final String fileNameMapping = AssemblyFormatUtils.evaluateFileNameMapping(outputFileNameMapping, artifact, configSource.getProject(), moduleProject, moduleArtifact, project, configSource);
final String outputLocation = destDirectory + fileNameMapping;
final File artifactFile = artifact.getFile();
logger.debug("Adding artifact: " + artifact.getId() + " with file: " + artifactFile + " to assembly location: " + outputLocation + ".");
if (fileMode != -1) {
archiver.addFile(artifactFile, outputLocation, fileMode);
} else {
archiver.addFile(artifactFile, outputLocation);
}

3)生成文件名:org.apache.maven.plugin.assembly.utils.AssemblyFormatUtils#evaluateFileNameMapping

打断点,查看outputFileNameMapping值为:${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}。生成的Jar包是否是时间戳,差异处在于${artifact.version}的值。

下面代码设置artifact的context值。

1
2
3
4
5
6
7
8
9
interpolator.addValueSource(new PrefixedObjectValueSource( "artifact.", artifact));
interpolator.addValueSource(new PrefixedObjectValueSource( "artifact.", artifact.getArtifactHandler()));

if (artifactProject != null) {
interpolator.addValueSource( new PrefixedObjectValueSource( "artifact.", artifactProject));
if (artifactProject.getArtifact() != null ) {
interpolator.addValueSource( new PrefixedObjectValueSource( "artifact.", artifactProject.getArtifact()));
}
}

4)TODO跟踪artifactProject何时非空

# 参考

  1. https://stackoverflow.com/questions/2516860/maven-how-to-create-assembly-with-snapshot-artifacts-without-timestamps-file-na

评论