2016-07-05 4 views
0

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?

Antwort

1

Ich habe diese Frage auch über die Gradle forums gestellt. Ich habe die folgende Lösung kopiert/eingefügt.


Gradle wird, ohne dass ein Artefakt mit einem pom/Efeu-Descriptor über einen Artefakt bevorzugen.Ich denke, das ist, warum gradle weiter sucht nach es findet eine Übereinstimmung in der flatDir-Repository. Dies kann oder kann Ihr Problem nicht lösen, aber Sie könnten ein FileCollectionDependency anstelle von ein ModuleDependency verwenden.

ZB:

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