Gradle插件如何获取自定义Configuration配置下的所有依赖列表
问题根因
Gradle 的项目配置存在固定生命周期顺序:插件的apply方法执行时机早于用户项目build.gradle中dependencies块的执行。你在刚创建完testConfig配置时就直接遍历依赖集合,此时用户声明的依赖还没有被添加到配置中,自然没有输出。
解决方案
将依赖读取逻辑放到项目配置完成后的回调中执行,推荐两种常用实现方式:
方式1:使用 afterEvaluate 监听项目配置完成事件
修改后的插件代码如下:
public class TestPlugin implements Plugin<Project> { public static final String VERSION = "1.0.0"; @Override public void apply(Project project) { project.getLogger().lifecycle("TestPlugin: " + VERSION); Configuration testConfig = project.getConfigurations().create("testConfig"); testConfig.setCanBeResolved(true); // 等项目所有配置完成后再读取依赖 project.afterEvaluate(p -> { for(Dependency dependency : testConfig.getDependencies()) { p.getLogger().lifecycle(" " + dependency.getName()); } // 如果需要获取解析后的全量传递依赖,可追加以下逻辑 // Set<ResolvedArtifact> artifacts = testConfig.getResolvedConfiguration().getResolvedArtifacts(); // for (ResolvedArtifact artifact : artifacts) { // p.getLogger().lifecycle("Resolved artifact: " + artifact.getFile().getName()); // } }); } }
方式2:监听配置的依赖添加事件
如果需要在依赖被添加时就实时处理,可以使用依赖集合的回调:
testConfig.getDependencies().whenObjectAdded(dependency -> { project.getLogger().lifecycle("New dependency added: " + dependency.getName()); });
这种方式不需要等整个项目配置完成,每添加一个依赖就会触发一次回调。
测试验证
测试项目build.gradle中按以下方式声明依赖即可正常打印:
plugins { id '你的插件id' } repositories { mavenLocal() } dependencies { testConfig 'com.example:你的测试依赖坐标:版本号' }
内容的提问来源于stack exchange,提问作者MisterCow1
相关产品推荐
相关产品推荐

