Gradle传递存储库和凭据

时间:2016-06-30 08:28:29

标签: java android maven gradle bintray

情况

我有多个使用JFrog Bintray的Android插件。这些都位于不同的 maven 存储库中。所有这些都有私有存储库,因此需要在解析这些依赖项之前进行身份验证。正在内部开发的项目A 项目B 以及由第三方开发的项目C ,需要实施项目B 作为依赖项,而依赖项项目A 。对于项目A ,将有 bintray用户1 ,该权限被授予项目A 的权限。第三方还会有 bintray用户2 项目B 对其进行身份验证。

项目B 中,依赖于项目A ,如下所示:

repositories {
    jcenter()

    maven {
        credentials {
            username = 'bintrayUser1'
            password = 'bintrayAPIKeyForUser1'
        }
        url  "https://url-to-projectA"
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.project:A:1.0.0'
}

现在还有另一个项目C ,它依赖于项目B ,如下所示:

allprojects {
    repositories {
        jcenter()
        maven {
            url "https://link-to-projectB"
            credentials {
                username = 'bintrayUser2'
                password = 'bintrayAPIKeyForUser2'
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.project:B:1.0.0'
}

问题

出现的问题是 bintray用户2 被要求告诉项目C 项目A ,并且需要对其进行身份验证。我想知道 bintray用户2 是否有可能不需要告诉项目C 项目A 所在的位置,而是将其从项目B

验证也是如此。有没有办法 bintray用户2 可以从 bintray用户1 复制项目A 的身份验证?

非优先解决方案

现在我可以做的是项目C 还告诉项目B 中每个依赖项的位置,但这并不能很好地扩展。这将是我将放入项目B 项目C 的每个私人依赖项都需要找到并需要进行身份验证。它看起来像这样:

allprojects {
    repositories {
        jcenter()
        maven {
            url "https://link-to-projectA"
            credentials {
                username = 'bintrayUser2'
                password = 'bintrayAPIKeyForUser2'
            }
        }
        maven {
            url "https://link-to-projectB"
            credentials {
                username = 'bintrayUser2'
                password = 'bintrayAPIKeyForUser2'
            }
        }
        maven {
            url "https://link-to-projectX"
            credentials {
                username = 'bintrayUser2'
                password = 'bintrayAPIKeyForUser2'
            }
        }
        maven {
            url "https://link-to-projectX"
            credentials {
                username = 'bintrayUser2'
                password = 'bintrayAPIKeyForUser2'
            }
        }
        maven {
            url "https://link-to-projectX"
            credentials {
                username = 'bintrayUser2'
                password = 'bintrayAPIKeyForUser2'
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.project:B:1.0.0'
}

这将变得难以管理,而您可能不想给予 bintray用户2 权限。

那么,有没有办法复制依赖关系位置和授权?

1 个答案:

答案 0 :(得分:4)

您必须使用“非首选解决方案”。

当Gradle构建 projectC 时,它会从maven下载依赖项<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="right-arrow" onclick="moveList('-=50px')"></div> <div id="left-arrow" onclick="moveList('+=50px')"></div> <div class="list"> <div class="list-item">1</div> <div class="list-item">2</div> <div class="list-item">3</div> <div class="list-item">4</div> <div class="list-item">5</div> <div class="list-item">6</div> <div class="list-item">7</div> <div class="list-item">8</div> <div class="list-item">9</div> <div class="list-item">10</div> </div>

使用依赖项,它还会下载包含嵌套依赖项compile 'com.project:B:1.0.0'的pom文件。然后它尝试从您在com.project:A:1.0.0(或顶级)中添加的存储库下载依赖项 在这一刻,gradle 不使用 projectB / build.gradle,但只使用pom文件。

这意味着gradle 无法知道凭据,无需在projectC/build.gradle文件中添加相关内容即可下载相关内容。