Gradle - Dependency Substitution无法在插件中工作

时间:2015-09-17 18:20:49

标签: plugins gradle dependencies build.gradle

我在使用Gradle插件时遇到了一些麻烦。我尝试在插件中进行依赖项替换,结果与我在build.gradle文件中进行替换时的结果不同。

我有Project1,它依赖于Project2。在Project2中,我有一个名为AClass的类,我在Project1中使用它。

然后我想用项目org.example:Project2:1.0替换模块:Project2。因此,在build.gradle中,我输入以下代码:

task updateDependency {
    configurations.all {
        resolutionStrategy.dependencySubstitution {
            substitute module("org.example:Project2:1.0") with project(":Project2")
        }
    }
}

工作正常。但是,如果我尝试将以下代码放在插件中:

public class UpdateDependency extends DefaultTask {

    @TaskAction
    public void executeTask() {

         project.configurations.all {
             resolutionStrategy.dependencySubstitution {
                 substitute module("org.example:Project2:1.0") with project(":Project2")
            }
        }


    }
}

并调用与代码关联的任务,它显示错误以下错误:

/home/me/Workspace/Project1/src/Main.java: error: cannot find symbol
          new AClass()
              ^
symbol:   class AClass
location: class Main
1 error
:compileJava FAILED

显然,Project1由于某些原因找不到Project2。

我使用以下任务运行Gradle(其中updateDependency是与依赖项替换相关联的任务的名称):

gradle clean updateDependency build

我怀疑它与Gradle应用代码的顺序有关,但我不知道如何修复它。

2 个答案:

答案 0 :(得分:4)

依赖项替换不得存在于任务操作中。它必须先触发。在执行任务时,依赖替换通常为时已晚。您的第一个代码段具有误导性,因为它不是在任务中执行,而是在配置阶段,即使它是在任务配置中完成的。

答案 1 :(得分:1)

为了完成,在Rene Groeschke所述的任务中确实不可能进行依赖替换。我最终在我的插件中添加了一个用于执行依赖项替换的类:

package com.example

import org.gradle.api.Project
import org.gradle.api.artifacts.ResolutionStrategy
import org.gradle.api.artifacts.DependencySubstitution

public class ResolveProject {
    public ResolveProject() {
        //Gets a static reference of the Project object from the class 
        // that extends Plugin<Project>
        Project project = PluginEntryPoint.getProject()

        project.configurations.all {
            resolutionStrategy.dependencySubstitution {
                substitute module("org.example:Project2:1.0") with project(":Project2")
            }
        }

    }
}

然后,必须从build.gradle文件

调用该类
apply plugin: 'myplugin'

buildscript {
    repositories { maven { url 'file:///path/to/my/maven/repo' } }
    depdendencies { classpath group: 'com.example', name: 'MyPlugin', version: '1.0' }
}

dependencies {
    //Adding the same dependency as the one in the ResolveProject class.
    compile "org.example:Project2:1.0" 
}

// This needs to be after the dependencies
new com.example.ResolveProject();
相关问题