在Gradle

时间:2016-07-05 07:18:59

标签: java gradle

在我的Gradle项目中,我需要定义两种类型的存储库:平面目录和Maven存储库(本地Nexus服务器)。

我可以让两个人分开工作,但不能让他们一起玩得很好。理想情况下,我会先让Gradle查看本地目录,然后再查看Maven存储库。

当前设置

我在build.gradle中定义了这样的存储库:

repositories {
    flatDir dirs: "${rootProject.projectDir}/libs"  
    flatDir dirs: "${rootProject.projectDir}/test.libs"

    maven {
        credentials {
            username nexus_username
            password nexus_password
        }
        url "http://nexus-server/nexus/content/groups/public"
    }
}

libs(和test.libs)目录中,jar文件名可能有也可能没有版本控制(但使用flatDir存储库时,我认为这是无关紧要的):< / p>

libs\activation.jar
libs\imap.jar
....
libs\<closed_source_framework>.jar
....
libs\gson-2.2.4.jar
libs\stax-utils.jar
.....

我无法使用本地Nexus服务器的原因是因为<closed_source_framework>.jar; libs文件夹中的大部分依赖项都与该发行版打包在一起,我无法可靠地获取版本信息以从Nexus中获取它们。

现在,其他一个团队正在将他们的罐子发布到Nexus服务器上,我希望能够从Nexus中取出他们的罐子,所以我已经(我)在build.gradle中定义了我的依赖项:

dependencies {

    // Grab other-team jar files from Nexus server
    compile "other-team-group:other-team-jar-1:version"
    compile "other-team-group:other-team-jar-2:version"
    compile "other-team-group:other-team-jar-3:version"

    // Grab everything else from 'flatDir'
    compile name: 'activation'
    compile name: 'imap'
    ...
    compile name: 'gson-2.2.4'
    compile name: 'stax-utils'
    .....

}

问题

现在我的问题来了。我原以为Gradle会按照repositories中指定的顺序搜索build.gradle;这意味着它首先查看本地libs文件夹,然后如果它无法在本地找到它,则转到Nexus。我所看到的是,Gradle正在为Nexus服务器查看本地libs文件夹中已有的jar文件。显然,这会减慢我的构建速度(我定义了~30个依赖项)。

一些信息

gradle properties命令输出,以显示存储库信息:

.....
repositories: [org.gradle.api.internal.artifacts.repositories.DefaultFlatDirArtifactRepository_Decorated@18814b1b, org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository_Decorated@6dff028]
.....

gradle --info compileJava的输出,以显示Gradle正在对Nexus进行查找:

.....
// Successfully find the other team jar files in Nexus, this is okay
Download http://nexus-server/nexus/content/groups/public/other-team-group/other-team-jar-1/version/other-team-jar-1-version.pom
Download http://nexus-server/nexus/content/groups/public/other-team-group/other-team-jar-2/version/other-team-jar-2-version.pom
Download http://nexus-server/nexus/content/groups/public/other-team-group/other-team-jar-3/version/other-team-jar-3-version.pom
.....
// Continues looking in Nexus for jar files that should be found in local libs folder
Resource missing. [HTTP GET: http://nexus-server/nexus/content/groups/public//activation//activation-.pom]
Resource missing. [HTTP HEAD: http://nexus-server/nexus/content/groups/public//activation//activation-.jar]
Resource missing. [HTTP GET: http://nexus-server/nexus/content/groups/public///imap//imap-.pom]
Resource missing. [HTTP HEAD: http://nexus-server/nexus/content/groups/public//imap//imap-.jar]
.....

底线

如何让Gradle停止查看Maven存储库以获取我知道它只能在本地找到的jar文件?

1 个答案:

答案 0 :(得分:1)

我也在Gradle forums上发布了这个问题。我已经复制/粘贴了以下解决方案。

  

Gradle会更喜欢带有pom / ivy描述符的工件   没有的神器。我想这就是gradle继续搜索的原因   它在flatDir存储库中找到匹配项。这可能会也可能不会解决   你的问题,但你可以使用FileCollectionDependency代替   一个ModuleDependency

     

例如:

ext {
   libs = "${rootProject.projectDir}/libs"
   testLibs = "${rootProject.projectDir}/test.libs"
}
dependencies {
   compile files("${libs}/activation.jar", "${libs}/imap.jar")
   compile files("${testLibs}/gson-2.2.4.jar")
   ...
}