gradle - Gradle-将所有项目的依赖项发布到另一个 Artifactory

标签 gradle artifactory

作为一个软件公司,我们被要求提供具有所有依赖关系的软件。依赖项应发布到另一个 Artifact 。换句话说,我们希望从项目中获取项目的所有依赖项,并将其发布到另一个项目中,从而使客户端能够构建软件。

有没有办法在Gradle中做到这一点?

最佳答案

改编自this gist

public class MavenArtifactCopyTask extends DefaultTask {
    @Input
    List<Configuration> configurations;

    @OutputDirectory
    File repoDir

    @TaskAction
    void build() {
        for (Configuration configuration : configurations) {
            copyJars(configuration)
            copyPoms(configuration)
        }
    }

    private void copyJars(Configuration configuration) {
        configuration.resolvedConfiguration.resolvedArtifacts.each { artifact ->
            def moduleVersionId = artifact.moduleVersion.id
            File moduleDir = new File(repoDir, "${moduleVersionId.group.replace('.','/')}/${moduleVersionId.name}/${moduleVersionId.version}")
            GFileUtils.mkdirs(moduleDir)
            GFileUtils.copyFile(artifact.file, new File(moduleDir, artifact.file.name))
        }
    }

    private void copyPoms(Configuration configuration) {
        def componentIds = configuration.incoming.resolutionResult.allDependencies.collect { it.selected.id }

        def result = project.dependencies.createArtifactResolutionQuery()
            .forComponents(componentIds)
            .withArtifacts(MavenModule, MavenPomArtifact)
            .execute()

        for(component in result.resolvedComponents) {
            def componentId = component.id

            if(componentId instanceof ModuleComponentIdentifier) {
                File moduleDir = new File(repoDir, "${componentId.group.replace('.','/')}/${componentId.module}/${componentId.version}")
                GFileUtils.mkdirs(moduleDir)                
                File pomFile = component.getArtifacts(MavenPomArtifact)[0].file
                GFileUtils.copyFile(pomFile, new File(moduleDir, pomFile.name))
            }          
        }
    }
}

用法
task copyMavenArtifacts(type: MavenArtifactCopyTask) {
    configurations = [project.configurations.all, project.buildScript.configurations.classpath]
    repoDir = file("$buildDir/mavenArtifacts")
}

一旦所有的jars和poms都位于maven目录结构中的本地文件夹中,您可以
  • 将它们全部上传到另一个存储库
  • 将该文件夹用作Maven存储库
  • 关于gradle - Gradle-将所有项目的依赖项发布到另一个 Artifactory ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44283342/

    相关文章:

    java - Hudson 插件未将所有 Artifactory 发布到 Artifactory

    android - LeakCanary 与 Cordova 的依赖关系 - 找不到方法 debugCompile()

    java - 如何在多模块项目中使用 JUnit5 和 SpringBoot2 通过 gradle 而不是 intelliJ 运行测试

    java - 想法调试或运行

    java - 一种从 Artifact 中删除 jar 的方法

    go - 无法使用 JFrog Artifactory 将 GitHub 私有(private)存储库代理为 Go Registry

    android - 如何解决Android Studio中的错误 “FAILURE:Build failed with an exception”?

    android - 如何在 gradle 任务中检索库版本

    java - Gradle 构建挂起而没有失败,DefaultFileLockManager 获取和释放守护进程地址注册表上的锁定

    scala - 使用环境变量将 sbt scala 项目发布到 Artifactory