Gradle下载完全依赖依赖链?

时间:2018-04-13 15:03:45

标签: gradle artifactory

我们目前正在组织中使用Artifactory,并且在下载整个依赖关系链时遇到了一些麻烦。例如,我们在项目中列出了以下依赖项:

compile group: 'org.jbpm', name: 'jbpm-flow-builder', version: droolsVersion

这个包依赖于一系列依赖关系,如:

jbpm-flow-builder
└───jbpm
    └───kie-parent-with-dependencies
        └───kie-platform-bom
            └───jboss-integration-platform-bom

不幸的是,jboss-integration-platform-bom在链中有数百个其他子依赖项。

我尝试了几种方法来下载所有必需的传递依赖项无济于事,因为我似乎没有完全遍历链,我必须构建,手动下载,上传到Artifactory,冲洗和重复。例如,这不起作用:

configurations {
    compile {
        transitive = true
    }
}

...

task copyDependencies(type: Copy) {
    from configurations.compile
    into 'dependencies'
}

我无法直接访问Artifactory来执行上传,因此我需要一种有效的方法将整个依赖关系链和关联的POM下载到单个文件夹中。非常感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:0)

我假设您要下载整个依赖关系树以构建项目。我建议使用更大的artifactory插件来构建gradle项目。它将下载所有项目依赖项,包括传递依赖项,构建项目,将构建工件发布到工件,以及收集和发布构建信息到artifactory。

请参阅插件通讯here。另请参阅一些项目示例here

答案 1 :(得分:0)

我能够在最初的问题中实现我所提出的要求,但是非常苛刻。首先,我清除了%userprofile%\.gradle\caches文件夹,以确保它完全干净。

接下来,我在build.gradle中注释掉了任何特定于内部的依赖项,并确保我的buildscript存储库和主存储库指向mavenLocalmavenCentral,如下所示:

buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }
}

repositories {
    mavenLocal()
    mavenCentral()
}

从这里开始,我继续构建应用程序并让所有依赖项下载。然后,我能够编写一个快速简单的PowerShell脚本,将所有缓存的POM和JAR文件拉入临时目​​录:

Get-ChildItem -Recurse C:\Users\<username>\.gradle\caches\ -Filter *.pom | %{  Copy-Item $_.FullName C:\temp\jar\ }
Get-ChildItem -Recurse C:\Users\<username>\.gradle\caches\ -Filter *.jar | %{  Copy-Item $_.FullName C:\temp\jar\ }

从这里开始,我无法访问Artifactory API端点,因此我继续编写另一个快速脚本来检查Artifactory中是否存在工件,如果它们已经存在,那么脚本会将它们从文件夹中删除仅提供上传所需的工件:

function Get-Artifact($JsessionId, $SearchString) {
 $session = New-Object Microsoft.Powershell.Commands.WebRequestSession
 $cookie = New-Object System.Net.Cookie
 $cookie.name = "JSESSIONID"
 $cookie.Value = $jsessionId
 $cookie.Domain = "artifactory.domain.com" 
 $session.Cookies.Add($cookie)
 $body = @{"query" = $searchString; "search" = "quick"; "selectedRepositories" = @()} | ConvertTo-JSON   
 $headers = @{"Content-Type" = "application/json;charset=UTF-8"}
 return ((Invoke-WebRequest -Uri http://artifactory.domain.com:8081/artifactory/ui/artifactsearch/quick -Method POST -WebSession $session -Headers $headers -Body $body).Content | ConvertFrom-Json).results.length
}

Get-ChildItem -Path C:\temp\jar | % { If((Get-Artifact -jsessionId "<session ID here>" -searchString $_.Name) -eq 0) { $_.Name } Else { Remove-Item $_.FullName } }