In meinem Gradle-Projekt muss ich zwei Arten von Repositorys definieren: ein flaches Verzeichnis und ein Maven-Repository (ein lokaler Nexus-Server).Kombinieren/Auflösen von zwei Repository-Typen in Gradle
Ich kann beide getrennt arbeiten, aber kann sie nicht gut zusammen spielen. Im Idealfall würde Gradle zuerst das lokale Verzeichnis und dann das Maven-Repository durchsuchen.
Aktuelle Einrichtung
ich die Repositories in meinem build.gradle
wie folgt definiert sind:
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"
}
}
Im libs
(und test.libs
) Verzeichnis können die JAR-Datei-Namen oder kann nicht der Versionsverwaltung (aber bei der Verwendung eines flatDir
Repository, glaube ich, dass das irrelevant ist):
libs\activation.jar
libs\imap.jar
....
libs\<closed_source_framework>.jar
....
libs\gson-2.2.4.jar
libs\stax-utils.jar
.....
Der Grund, warum ich unseren lokalen Nexus-Server nicht für alles verwenden kann, ist wegen <closed_source_framework>.jar
; Die meisten Abhängigkeiten im Ordner libs
sind im Lieferumfang dieser Distribution enthalten, und ich kann die Versionsinformationen nicht zuverlässig abrufen, um sie von Nexus zu beziehen.
nun eines der anderen Teams veröffentlicht ihre Gläser auf den Nexus-Server und ich möchte in der Lage sein, ihre Gläser von Nexus zu ziehen, so habe ich (wieder) definiert meine Abhängigkeiten in meinem 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'
.....
}
Das Problem
So kommt nun mein Problem. Ich hatte erwartet, dass Gradle die repositories
in der in meiner build.gradle
angegebenen Reihenfolge suchen würde; Das heißt, dass es zunächst nach dem lokalen Ordner libs
suchen und dann zu Nexus wechseln würde, wenn es lokal nicht gefunden werden kann. Was ich stattdessen sehe, ist, dass Gradle auf dem Nexus-Server nach den JAR-Dateien sucht, die sich bereits im lokalen Ordner libs
befinden. Offensichtlich verlangsamt das meinen Build (ich habe ~ 30 Abhängigkeiten definiert).
Einige Info
Ausgabe von gradle properties
Befehl, Repository-Informationen anzuzeigen:
.....
repositories: [org.gradle.api.internal.ar[email protected]18814b1b, org.gradle.api.internal.[email protected]6dff028]
.....
Ausgabe von gradle --info compileJava
, zu zeigen, dass Gradle eine Lookup Nexus tut:
.....
// 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]
.....
Bottom Line
Wie kann ich Gradle dazu bringen, auf das Maven-Repository für JAR-Dateien zu verzichten, von denen ich weiß, dass sie nur lokal gefunden werden?