Maven构建时如何传递性复制非项目依赖的外部构件
Maven构建时复制外部构件传递依赖的实现方案
最轻量化的实现方式是直接使用maven-dependency-plugin,不需要引入额外插件,也不会把外部构件污染到项目自身的依赖树中,配置方式如下:
- 在项目pom.xml的build节点下添加插件配置,通过独立的
artifactItems块声明你需要拉取的外部构件坐标,插件会自动解析这些构件的全量传递依赖,和项目自身的依赖完全隔离:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.6.1</version> <executions> <execution> <id>copy-external-transitive-deps</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!-- 在此处声明所有需要处理的外部构件,可配置多个 --> <artifactItems> <artifactItem> <groupId>替换为外部构件的groupId</groupId> <artifactId>替换为外部构件的artifactId</artifactId> <version>替换为外部构件的版本号</version> <type>jar</type> </artifactItem> </artifactItems> <!-- 开启传递依赖复制 --> <includeTransitive>true</includeTransitive> <!-- 指定输出目录,对应你需要的/target/workspace/jars-go-here路径 --> <outputDirectory>${project.build.directory}/workspace/jars-go-here</outputDirectory> <!-- 按需配置是否去掉jar文件名中的版本号 --> <stripVersion>false</stripVersion> <!-- 按需配置排除规则,比如排除项目自身的构件避免重复 --> <excludeGroupIds>${project.groupId}</excludeGroupIds> </configuration> </execution> </executions> </plugin>
- 如果你需要更复杂的包管理规则,比如按依赖scope筛选、排除特定冲突包、同步输出其他资源文件,可以替换为
maven-assembly-plugin实现:在自定义的assembly描述文件中单独为外部构件创建dependencySet,将useTransitiveDependencies设置为true,指定输出目录为目标路径即可,同样不会和项目自身依赖产生冲突。
注意事项:如果要拉取的外部构件不在Maven中央仓库或你已配置的私服中,需要提前在pom.xml的
<repositories>节点或Maven全局settings.xml中添加对应仓库地址,否则构建时会报构件找不到的错误。
配置完成后执行mvn clean package命令,构建完成后直接检查目标输出目录,就能看到指定外部构件及其所有传递依赖的jar包,后续Spring Boot服务启动时将该目录加入类路径扫描范围即可正常访问目录下的文件。
内容的提问来源于stack exchange,提问作者JimBob
相关产品推荐
相关产品推荐

