一、现象
通过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何时非空
# 参考
- https://stackoverflow.com/questions/2516860/maven-how-to-create-assembly-with-snapshot-artifacts-without-timestamps-file-na