maven-dependency-plugin配置下载全量依赖(含传递依赖、sources、javadoc)问题
配置错误根因
- 重复定义单值配置项
<classifier>:POM中同路径的重复单值配置只会保留最后一个,你先后配置了sources、javadoc两个classifier,最终仅javadoc配置生效,这是之前执行命令只拷贝javadoc包的直接原因。 <includeClassifiers>配置逻辑错误:二进制主Jar没有classifier属性,配置includeClassifiers仅包含sources、javadoc会直接过滤掉所有主Jar,导致主包无法被拷贝。mvn package无执行输出的原因:你注释了<sourceDirectory>配置,Maven默认扫描src/main/java路径找不到源码,会跳过编译等核心构建阶段,绑定在package阶段的插件逻辑自然不会触发。- 认知误区:
copy-dependencies目标单次执行仅能匹配一种classifier的包,无法在一个执行块中同时配置多个classifier实现多类包同时拷贝。
正确可运行POM配置
<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> <groupId>gq.jetstream</groupId> <artifactId>maven-download-sources-javadocs</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <org.springframework.version>5.2.22.RELEASE</org.springframework.version> <!-- 统一配置依赖包输出目录 --> <dep.output.dir>${project.build.directory}/dependency-jars/</dep.output.dir> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${org.springframework.version}</version> </dependency> </dependencies> <build> <plugins> <!-- 空项目跳过编译,避免无源码导致package阶段中断 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.1</version> <configuration> <skipMain>true</skipMain> <skip>true</skip> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.3.0</version> <executions> <!-- 拷贝二进制主Jar(包含所有传递依赖) --> <execution> <id>copy-main-jars</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <includeScope>runtime</includeScope> <outputDirectory>${dep.output.dir}</outputDirectory> </configuration> </execution> <!-- 拷贝sources源码Jar(包含所有传递依赖) --> <execution> <id>copy-sources-jars</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <includeScope>runtime</includeScope> <classifier>sources</classifier> <outputDirectory>${dep.output.dir}</outputDirectory> </configuration> </execution> <!-- 拷贝javadoc文档Jar(包含所有传递依赖) --> <execution> <id>copy-javadoc-jars</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <includeScope>runtime</includeScope> <classifier>javadoc</classifier> <outputDirectory>${dep.output.dir}</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
使用说明
- 直接在项目根目录执行
mvn clean package,所有声明依赖(含传递依赖)的主Jar、sources Jar、javadoc Jar都会自动从Maven Central下载并拷贝到target/dependency-jars/目录下。 - 如果需要单独执行某类拷贝逻辑,可以使用
mvn dependency:copy-dependencies@<execution-id>格式,比如单独拷贝源码包就执行mvn dependency:copy-dependencies@copy-sources-jars。 - 如果需要修改输出目录,直接修改properties节点下的
dep.output.dir配置值即可,三个拷贝任务会统一使用该目录。 - 若部分依赖未在Maven仓库上传对应sources或javadoc包,插件会自动跳过缺失的包,不会中断构建,属于正常情况。
内容的提问来源于stack exchange,提问作者JetStream
相关产品推荐
相关产品推荐

