maven-dependency-plugin:useSubDirectoryPerArtifact不受useBaseVersion影响的解决咨询
Maven Dependency Plugin:让unpack-dependencies的子目录使用BaseVersion而非Timestamp版本
问题场景
期望将指定依赖解压到以artifactId-baseVersion-type命名的独立目录,例如:
target/unpacked/artifactA-1.0-SNAPSHOT-war/contentAtarget/unpacked/artifactB-2.0-SNAPSHOT-ear/contentB
但当前配置下,useSubDirectoryPerArtifact生成的子目录会使用带timestamp的Snapshot版本号(如artifactA-1.0-timestampXXX-war),仅解压后的工件文件名受useBaseVersion控制。
解决方案(无需手动解压)
核心思路是利用Maven依赖处理时暴露的artifact对象属性,直接指定子目录的命名规则,替代默认的resolved版本号。
方案1:通过subDirectory参数定义子目录格式
保留useSubDirectoryPerArtifact,添加subDirectory参数明确指定目录命名规则:
<execution> <id>unpack-applications</id> <phase>generate-resources</phase> <goals> <goal>unpack-dependencies</goal> </goals> <configuration> <includeArtifactIds>artifactA,artifactB</includeArtifactIds> <includeTypes>war,ear</includeTypes> <outputDirectory>target/unpacked</outputDirectory> <useSubDirectoryPerArtifact>true</useSubDirectoryPerArtifact> <subDirectory>${artifact.artifactId}-${artifact.baseVersion}-${artifact.type}</subDirectory> <useBaseVersion>true</useBaseVersion> </configuration> </execution>
方案2:在outputDirectory中嵌入动态表达式
去掉useSubDirectoryPerArtifact,直接通过outputDirectory的动态表达式为每个依赖分配独立目录:
<execution> <id>unpack-applications</id> <phase>generate-resources</phase> <goals> <goal>unpack-dependencies</goal> </goals> <configuration> <includeArtifactIds>artifactA,artifactB</includeArtifactIds> <includeTypes>war,ear</includeTypes> <outputDirectory>target/unpacked/${artifact.artifactId}-${artifact.baseVersion}-${artifact.type}</outputDirectory> <useBaseVersion>true</useBaseVersion> </configuration> </execution>
效果说明
两种方案均通过${artifact.baseVersion}获取不带timestamp的BaseVersion值(如1.0-SNAPSHOT),最终生成的目录结构完全符合预期,无需额外手动解压或重命名操作。
内容的提问来源于stack exchange,提问作者Clément Honoré
相关产品推荐
相关产品推荐

