gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:44:14 25 4
gpt4 key购买 nike

在我的 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 会搜索 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 文件?

最佳答案

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

<小时/>

Gradle will prefer an artifact with an pom/ivy descriptor over an artifact without. I think this is why gradle continues searching after it finds a match in the flatDir repository. This may or may not solve your problem, but you could use a FileCollectionDependency instead of a ModuleDependency.

Eg:

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")
...
}

关于java - 在 Gradle 中组合/解析两种存储库类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38197447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com