Maven相关技术问询:执行mvn clean install时导出依赖到文件,及在plugin.yml中生成依赖列表并过滤特定依赖
Maven相关技术问询:执行mvn clean install时导出依赖到文件,及在plugin.yml中生成依赖列表并过滤特定依赖
嗨,这个需求我之前帮同事处理过,其实用Groovy脚本配合Maven插件就能很灵活地实现,既能生成你要的groupId:artifactId:version格式的依赖列表,还能轻松过滤掉不需要的依赖,具体步骤我给你拆解下:
一、在pom.xml中添加Groovy插件生成依赖属性
我们可以用groovy-maven-plugin在Maven处理资源文件之前,先遍历项目依赖、过滤掉不需要的项,然后把符合要求的依赖列表转成Maven属性,这样后面资源过滤的时候就能直接引用了。
在你的pom.xml的<build><plugins>节点下添加如下配置:
<plugin> <groupId>org.codehaus.gmaven</groupId> <artifactId>groovy-maven-plugin</artifactId> <version>2.1.1</version> <executions> <execution> <id>generate-dependency-list</id> <!-- 选generate-resources阶段,确保在资源过滤前执行 --> <phase>generate-resources</phase> <goals> <goal>execute</goal> </goals> <configuration> <source> // 定义要排除的特定依赖,格式为「groupId:artifactId」 def excludedDeps = [ "javax.annotation:javax.annotation-api", "some.group:excluded-artifact" ] // 遍历项目依赖,过滤出符合要求的项 def libraries = project.dependencies.findAll { dep -> // 这里可以自定义过滤规则: // 1. 排除scope为provided的依赖 // 2. 排除在excludedDeps列表中的特定依赖 dep.scope != "provided" && !excludedDeps.contains("${dep.groupId}:${dep.artifactId}") }.collect { dep -> // 转成你要的「groupId:artifactId:version」格式 "${dep.groupId}:${dep.artifactId}:${dep.version}" }.join(", ") // 把结果设置为Maven属性,名字叫project.libraries project.properties.setProperty("project.libraries", libraries) </source> </configuration> </execution> </executions> </plugin>
过滤规则的灵活调整
你可以根据自己的需求修改findAll里的判断条件:
- 如果要排除
testscope的依赖,就加&& dep.scope != "test" - 如果要排除某个groupId下的所有依赖,改成
&& !dep.groupId.equals("javax.annotation") - 如果要排除optional依赖,加
&& !dep.optional
二、在plugin.yml中引用生成的依赖属性
在你的src/main/resources/plugin.yml里,直接用Maven占位符引用刚才生成的属性:
libraries: [${project.libraries}]
别忘了你已经配置的资源过滤要保留,确保Maven会替换这个占位符:
<resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources>
三、验证效果与导出依赖到文件
执行mvn clean process-resources命令,然后去target/classes目录下查看生成的plugin.yml,你会看到libraries已经变成了符合要求的依赖列表,而且不需要的依赖已经被过滤掉了。
如果要把依赖同时导出到单独的文件,你可以在Groovy脚本里加几行代码,把列表写入到文件里,比如:
// 在生成libraries之后添加 new File(project.build.directory, "dependency-list.txt").text = libraries
这样执行命令后,target/dependency-list.txt里就会有同样的依赖列表了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

