Gradle - 依赖替换在插件中不起作用
Gradle - Dependency Substitution not working in a plugin
我在使用 Gradle 插件时遇到了一些问题。我试图在插件中进行依赖替换,结果与我在 build.gradle
文件中进行替换时的结果不同。
我有依赖于 Project2 的 Project1。在 Project2 中,我有一个名为 AClass
的 class,我在 Project1 中使用它。
然后我想用项目 :Project2
替换模块 org.example:Project2:1.0
。因此,在 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应用代码的顺序有关,但我不知道如何解决它。
依赖替换不得存在于任务操作中。它必须在之前触发。执行任务时,依赖替换通常为时已晚。您的第一个代码段具有误导性,因为它不是在任务中执行的,而是在配置阶段执行的,即使它是在任务配置中完成的。
为了完成,Rene Groeschke 所说的任务中的依赖替换确实是不可能的。我最终在我的插件中添加了一个 class 来执行依赖替换:
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")
}
}
}
}
然后,class 必须从 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();
我在使用 Gradle 插件时遇到了一些问题。我试图在插件中进行依赖替换,结果与我在 build.gradle
文件中进行替换时的结果不同。
我有依赖于 Project2 的 Project1。在 Project2 中,我有一个名为 AClass
的 class,我在 Project1 中使用它。
然后我想用项目 :Project2
替换模块 org.example:Project2:1.0
。因此,在 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应用代码的顺序有关,但我不知道如何解决它。
依赖替换不得存在于任务操作中。它必须在之前触发。执行任务时,依赖替换通常为时已晚。您的第一个代码段具有误导性,因为它不是在任务中执行的,而是在配置阶段执行的,即使它是在任务配置中完成的。
为了完成,Rene Groeschke 所说的任务中的依赖替换确实是不可能的。我最终在我的插件中添加了一个 class 来执行依赖替换:
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")
}
}
}
}
然后,class 必须从 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();