【问题标题】:Downloading Dependences From Private Amazon S3 Repository with Gradle使用 Gradle 从私有 Amazon S3 存储库下载依赖项
【发布时间】:2026-01-30 22:30:01
【问题描述】:

我希望将 Groovy 支持添加到现有的 java 项目中,以便我可以使用 invokedynamic 无缝编译混合的 Java 和 Groovy 代码,从而获得Java-like execution speed without needing to waste excessive amounts of time with verbose Java syntax

在读到 gmaven 插件不再支持编译 - 以及 groovy eclipse 编译器插件doesn't yet support invokedynamic 之后,我问自己,如果 Maven 编译了不必要的慢的 Groovy 代码,我为什么还要继续使用?

因此,我决定尝试为 Gradle 废弃 maven,以便获得更快的代码,同时将一些 python 部署脚本移植到 Gradle 任务中,以便只需要一个代码库。

我有一些库存储在一个简单的受密码保护的 s3 maven 存储库中(为了避免像工件一样需要企业过度杀伤力)。在做了一些基础研究之后,我发现 Gradle 没有内置支持添加由 this stack overlow questionthis support forums post 确定的自定义依赖管理。

我确实设法找到了s3 plugin for gradle - 但它不处理依赖项管理。

如果 Gradle 的全部意义在于比 Maven 更灵活,并且如果依赖管理/构建系统的核心目的是有效地管理来自各种来源的依赖 - 那么缺乏对自定义存储库的支持似乎是一个相当重大的设计缺陷使我迄今为止在 Maven 中遇到的任何问题都相形见绌。

但是,我很可能遗漏了一些东西,而且我已经投入了几个小时来学习 Gradle - 所以我想我会看看是否有一些合理的方法来模拟这些 s3 依赖项的依赖管理,直到 Gradle 开发人员解决这个问题关键问题。否则我将不得不得出结论,在编译器插件支持 invokedynamic 之前,我最好只使用 Maven 并容忍较慢的 Groovy 代码。

基本上我需要一个执行以下操作的解决方案:

  1. 将依赖项和传递依赖项下载到 gradle 缓存
  2. 不需要我硬编码 gradle 缓存的路径 - 这样我的构建脚本就独立于平台了。
  3. 如果依赖项已经在缓存中,则不会再次下载它们。
  4. 适用于多模块项目。

但是,我在文档中找不到任何可以让我知道从哪里开始的线索:

【问题讨论】:

    标签: groovy amazon-s3 gradle dependency-management build.gradle


    【解决方案1】:

    Gradle 2.4 has native support for S3 repositories。下载依赖项和发布工件。

    使用 IAM 凭证下载(从上面的链接中解释):

    repositories {
        maven {
            url "s3://someS3Bucket/path/to/repo/root"
            credentials(AwsCredentials) {
                accessKey 'access key'
                secretKey 'secret key'
            }
        }
    }
    

    然后像往常一样指定你的依赖项。

    【讨论】:

    【解决方案2】:

    您不需要任何自定义存储库支持即可完成这项工作。只需使用正确的 URL 声明一个 maven 存储库。如果存储库在 Maven 中使用时可以正常工作,那么它也可以与 Gradle 一起使用。 (上传可能是另一回事。)

    【讨论】:

    • 这是一个私有的 s3 存储库,所以我必须使用 s3:// 协议。它只能通过特定的构建扩展在 Maven 中工作: org.springframework.build.awsorg.springframework.build.aws.maven3.0.0.RELEASE
    • 所以您遗漏了最重要的信息。 :-) AFAIK,目前无法通过插件向 Gradle 添加自定义存储库支持。 PS:我不会想当然地认为在当前 JVM 上调用动态 Groovy 比标准 Groovy 快得多。
    • 是否正在提供支持,还是可能多年后都不会提供支持?
    • 我无法做出任何预测。
    【解决方案3】:

    你可以使用 S3 和 http

    repositories {
        mavenCentral()
        ivy {
            url "https://s3-eu-west-1.amazonaws.com/my-bucket"
            layout "pattern", {
                artifact "[artifact]-[revision].[ext]"
                m2compatible = true
            }
        }
    }
    

    将 S3 中的 jar 命名为 my-bucket 中的 name-rev.jar (joda-time-3.2.jar)。 还要上传一个pom文件。 并在 S3 中授予下载 jar 和 pom 的所有权限。

    【讨论】:

      最近更新 更多