在Gradle中组合/解析两种存储库类型

uqjltbpv  于 2023-04-06  发布在  其他
关注(0)|答案(2)|浏览(122)

在我的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存储库时,我相信这是无关紧要的):

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中提取它们。
现在,另一个团队正在将他们的jar发布到Nexus服务器,我希望能够从Nexus中提取他们的jar,因此我在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会按照我的build.gradle中指定的顺序搜索repositories;这意味着它会首先查找本地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文件,因为我知道它只能在本地找到这些文件?

s2j5cfk0

s2j5cfk01#

我也在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")
   ...
}
hvvq6cgz

hvvq6cgz2#

也许(如documentation所示)使用:

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

对我很有效

相关问题