Gradle - 获取依赖项的 URL

Posted

技术标签:

【中文标题】Gradle - 获取依赖项的 URL【英文标题】:Gradle - get URL of dependency artifact 【发布时间】:2016-10-08 10:24:40 【问题描述】:

我想在 Gradle 获得所有可用的依赖项之后手动下载依赖项,因此我想获取 Gradle 用于下载这些构件的 URL。

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

【问题讨论】:

两个论坛页面表明这还不可能。 discuss.gradle.org/t/…discuss.gradle.org/t/how-to-get-urls-for-dependencies/6349/2 【参考方案1】:

以 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 -> https://jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar

PS:你的项目的结果依赖

repositories 
    jcenter()
    mavenCentral()

所以,结果可能是:

任务:getURLofDependencyArtifact

com.google.code.gson:gson:2.8.6 -> https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar

【讨论】:

如果组为空,dependency.group.replace 可能会失败,因此 try 应该在 def jarUrl 行之前向上移动,IMO。 我正在获取 URL 为 .m2 本地文件夹的依赖项。有没有办法获取工件 URL 而不是 .m2 位置?【参考方案2】:

想要类似的东西,但在 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") 
    

更新:但是它可能无法找到间接依赖关系。

【讨论】:

【参考方案3】:

使用 Gradle 6.0 或更高版本,另一种输出 URL 的方法是将 --refresh-dependencies--info 混合使用

// 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

注意--refresh-dependencies

认为使用 --refresh-dependencies 是一个常见的误解 将强制下载依赖项。情况并非如此:Gradle 将 只执行刷新动态的严格要求 依赖项。这可能涉及下载新的列表或元数据 文件,甚至是工件,但如果没有任何改变,影响是 最小。

来源:https://docs.gradle.org/current/userguide/dependency_management.html

另见:How can I force gradle to redownload dependencies?

【讨论】:

以上是关于Gradle - 获取依赖项的 URL的主要内容,如果未能解决你的问题,请参考以下文章

如何在 gradle 中获取依赖项的元数据?

从 Gradle v7+ 获取版本目录中所有依赖项的列表

gradle 到 maven 的转换,在依赖项的依赖项的版本名称中解析通配符“+”?

用于依赖项的 Gradle 私有存储库

gradle 在哪里保存依赖项的 jar?

用于仅测试依赖项的 Gradle 变体感知依赖项管理