在我的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文件?
答案 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")
...
}