如何通过变量为maven-dependency-plugin的copy目标提供构件列表
结论
你当前的直接引用方式不可行,artifactItems是Maven插件配置的集合类型节点,仅支持<artifactItem>子节点格式的配置,无法直接解析逗号分隔的纯文本坐标字符串,属性替换后无法被Maven识别为合法配置。
可行实现方案
方案1:使用copy目标原生支持的逗号分隔坐标参数(最简便)
maven-dependency-plugin的copy目标提供了artifact配置项,原生接受逗号分隔的GAV坐标字符串,刚好匹配你的需求,修改后配置如下:
<project> [...] <properties> <my-artifacts>org.junit:junit,org.slf4j:slf4j</my-artifacts> </properties> <build> <plugins> <plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <goals> <goal>copy</goal> </goals> <configuration> <!-- 替换artifactItems为artifact参数 --> <artifact>${my-artifacts}</artifact> <!-- 可配置统一的输出目录 --> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> [...] </project>
该方案局限:所有构件使用统一的输出、解压规则,不支持单构件个性化配置。
方案2:属性存储完整XML配置片段(支持个性化配置)
如果需要为不同构件单独指定输出路径、重命名、解压规则,可以直接将完整的<artifactItem>节点片段存入属性,Maven会在属性替换后正常解析XML结构,示例配置如下:
<project> [...] <properties> <!-- 属性值为完整的artifactItem节点片段 --> <my-artifacts> <artifactItem> <groupId>org.junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <outputDirectory>${project.build.directory}/test-lib</outputDirectory> </artifactItem> <artifactItem> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> <outputDirectory>${project.build.directory}/main-lib</outputDirectory> </artifactItem> </my-artifacts> </properties> <build> <plugins> <plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> ${my-artifacts} </artifactItems> </configuration> </execution> </executions> </plugin> </plugins> </build> [...] </project>
内容的提问来源于stack exchange,提问作者yegor256
相关产品推荐
相关产品推荐

