Gradle-获取依赖项工件的URL

Gradle-获取依赖项工件的URL,gradle,Gradle,我希望在将来Gradle拥有所有可用的依赖项工件之后手动下载依赖项工件,因此我希望获得Gradle用来下载这些工件的URL 有没有办法获取Gradle下载的工件的依赖项URL?以gson为例: dependencies { // https://mvnrepository.com/artifact/com.google.code.gson/gson compile 'com.google.code.gson:gson:2.8.6' } 创建要打印url的任务: task get

我希望在将来Gradle拥有所有可用的依赖项工件之后手动下载依赖项工件,因此我希望获得Gradle用来下载这些工件的URL


有没有办法获取Gradle下载的工件的依赖项URL?

以gson为例:

dependencies {
    // https://mvnrepository.com/artifact/com.google.code.gson/gson
    compile 'com.google.code.gson:gson:2.8.6'
}
创建要打印url的任务:

task getURLofDependencyArtifact() {
    doFirst {
        project.configurations.compile.dependencies.each { dependency ->
            for (ArtifactRepository repository : project.repositories.asList()) {
                def url = repository.properties.get('url')
                //https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar
                def jarUrl = String.format("%s%s/%s/%s/%s-%s.jar", url.toString(),
                        dependency.group.replace('.', '/'), dependency.name, dependency.version,
                        dependency.name, dependency.version)
                try {
                    def jarfile = new URL(jarUrl)
                    def inStream = jarfile.openStream();
                    if (inStream != null) {
                        println(String.format("%s:%s:%s", dependency.group, dependency.name, dependency.version)
                                + " -> " + jarUrl)
                        return
                    }
                } catch (Exception ignored) {
                }
            }
        }
    }
}

运行
/gradlew getURLofDependencyArtifact

任务:getURLofDependencyArtifact

com.google.code.gson:gson:2.8.6->

PS:项目的结果依赖关系

repositories {
    jcenter()
    mavenCentral()
}
因此,结果可能是:

任务:getURLofDependencyArtifact

com.google.code.gson:gson:2.8.6->


想要一些类似的东西,但在Android和Kotlin DSL上,所以基于@andforce的答案开发了这个,希望对其他人也有用

import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
import java.net.URL

val dependenciesURLs: Sequence<Pair<String, URL?>>
    get() = project.configurations.getByName(
        "implementation"
    ).dependencies.asSequence().mapNotNull {
        it.run { "$group:$name:$version" } to project.repositories.mapNotNull { repo ->
            (repo as? UrlArtifactRepository)?.url
        }.flatMap { repoUrl ->
            "%s/%s/%s/%s/%s-%s".format(
                repoUrl.toString().trimEnd('/'),
                it.group?.replace('.', '/') ?: "", it.name, it.version,
                it.name, it.version
            ).let { x -> listOf("$x.jar", "$x.aar") }
        }.firstNotNullResult { url ->
            runCatching {
                val connection = URL(url).openConnection()
                connection.getInputStream() ?: throw Exception()
                connection.url
            }.getOrNull()
        }
    }
tasks.register("printDependenciesURLs") {
    doLast {
        dependenciesURLs.forEach { (dependency: String, url: URL?) -> println("$dependency => $url") }
    }
}
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
导入java.net.URL
val dependenciesURLs:序列
get()=project.configurations.getByName(
“实施”
).dependencies.asSequence().mapNotNull{
it.run{“$group:$name:$version”}到project.repositories.mapNotNull{repo->
(回购为?UrlArtifactRepository)?.url
}.flatMap{repoUrl->
“%s/%s/%s/%s/%s/%s-%s”。格式(
repoUrl.toString().trimEnd('/'),
it.group?.replace(“.”,“/”)?:“”,it.name,it.version,
it.name,it.version
).let{x->listOf(“$x.jar”,“$x.aar”)}
}.firstNotNullResult{url->
奔跑{
val connection=URL(URL).openConnection()
connection.getInputStream()?:抛出异常()
connection.url
}.getOrNull()
}
}
任务。注册(“PrintDependenciesURL”){
多拉斯特{
dependenciesURLs.forEach{(依赖项:字符串,url:url?->println(“$Dependencies=>$url”)}
}
}

更新:它可能无法找到间接依赖项。

使用Gradle 6.0或更高版本,输出URL的另一种方法是将
--刷新依赖项
--信息

// bash/terminal
./gradlew --info --refresh-dependencies
// cmd
gradlew --info --refresh-dependencies
或输出到文件

// bash/terminal
./gradlew --info --refresh-dependencies > urls.txt
// cmd
gradlew --info --refresh-dependencies > urls.txt
关于“刷新依赖项”的说明

认为使用--刷新依赖项是一种常见的误解 将强制下载依赖项。事实并非如此:格拉德尔会的 仅执行刷新动态文件所严格要求的操作 依赖关系。这可能涉及下载新的列表或元数据 文件,甚至工件,但如果没有任何更改,则影响是 最小的

资料来源:


另请参见:

两个论坛页面表明这还不可能<如果组为空,则code>dependency.group.replace可能会失败,因此应将
try
上移到IMO的
def jarUrl
行之前。我正在获取URL为
.m2
本地文件夹的依赖项。有没有办法获取工件URL而不是
.m2
位置?