如何使Gradle存储库指向本地目录

时间:2014-09-22 02:26:05

标签: maven gradle build.gradle

出于某种原因,我的离岸团队无法从我的客户Artifactory下载工件(依赖关系),这是我们的组织依赖存储库。"刷新依赖关系"什么都不触发,并给出超时超时。我看到了我的" Gradle Dependencies"被下载到位置" D:/C813507/Gradle/gradle-1.11/bin/caches/modules-2/files-2.1 /"。我可以将此文件夹压缩并发送给他们吗?他们如何在gradle中实现指向其本地目录的内容。我的构建gradle具有以下行。如何在Windows操作系统中将URL指向本地目录

repositories {
         maven {
            url 'http://artifactory.myorg.com:8081/artifactory/plugins-release'
        }

}

3 个答案:

答案 0 :(得分:25)

如果您无法访问离岸团队,则可以将所需的所有依赖项jar复制到单个目录中,然后使用flatDir存储库。

repositories {
   flatDir {
       dirs 'D:/path/to/local/directory'
   }
}


dependencies {
   compile name: 'name-of-jar'
}

不使用flatDir存储库的另一种方法是:

dependencies {
    compile files('/path/to/dir/something_local.jar')
}

答案 1 :(得分:14)

您可以声明一个本地flatDir存储库,而不是配置maven存储库,如下所示:

repositories {
   maven {
       url 'file://D:/path/to/local/directory'
   }
}

正如 @Peter Niederwieser 所提到的,flatDir存储库不支持传递依赖项解析。 maven本地存储库可以。

答案 2 :(得分:3)

使用如下所示的flatDir是一种选择:

repositories {
   flatDir {
       dirs 'D:/path/to/local/directory'
   }
}

这有效。但是,如果有mavenCentral()或其他包含相同JAR的Maven存储库,则将优先于FlatDir优先于Maven存储库。

摘自Gradle文档:https://docs.gradle.org/current/userguide/repository_types.html

  

Gradle将动态生成模块描述符(不包含任何   依赖项信息)。然而,   因为Gradle倾向于使用已创建描述符的模块   从真实的元数据而不是生成的平面目录   存储库不能用于覆盖具有真实元数据的工件   来自其他存储库。例如,如果Gradle仅找到   平面目录存储库中的jmxri-1.2.1.jar,而jmxri-1.2.1.pom位于   另一个支持元数据的存储库,它将使用第二个   存储库以提供模块。

所以flatDir不好。我们应该使用第二个答案中提到的本地Maven存储库。但是第二个答案有几个问题

  1. 不便携
  2. 如果人工物品也存在于全局存储库中,则不清楚从何处挑选人工物品。

我们可以使用以下解决方案来解决这些问题:

  1. 在项目目录中创建一个名为libs的文件夹
  2. 将您的工件复制到此libs目录中(如果您使用的是git或任何其他scm,请确保分发此libs fodler,以便其他人可以gradle build而不会遇到任何问题)
  3. 在您的libs目录中声明一个Maven存储库,并在列出任何其他存储库之前调用mavenLocal()。此步骤对于确保从您的本地目录(而不是其他全局存储库)中选择jar至关重要。
repositories {
   maven {
       url uri("${projectDir}/libs")
   }

   mavenLocal()
   <All your Repos here>
   mavenCentral()
}

这样,您可以确保即使其他仓库中也存在JAR,也只能从本地目录中选择该JAR,并且该解决方案也可以移植。