2014-05-13 10 views
39

Ich frage mich, ob es trotzdem etwas gab, um bestimmte Dateien, die in einer Abhängigkeit (keine transitive Abhängigkeit) liegen, vom Download auszuschließen.Gradle schließt bestimmte Dateien innerhalb der Abhängigkeit aus

Ich bin ein Build von Ant + Ivy nach Gradle und dies wurde mit in Ivy vorher getan. Ich frage, weil ich eine einzige Abhängigkeit habe, die viele kompilierte wsdl-Jars in Artifactory enthält, die wir herunterziehen, aber ich möchte nicht alle Jars in der Abhängigkeit herunterladen.

In Ivy war es Setup wie:

sind in einem Verzeichnis Repo-/dep.location/example/7.3/jar Diese 6 Artefakte veröffentlicht Artifactory.

<publications> 
    <artifact name="foo-1-0" type="jar" /> 
    <artifact name="foo-1-0-async" type="jar" /> 
    <artifact name="foo-1-0-xml" type="jar" /> 
    <artifact name="bar-1-0" type="jar" /> 
    <artifact name="bar-1-0-async" type="jar" /> 
    <artifact name="bar-1-0-xml" type="jar" /> 
</publications> 

So erfasse ich nur zwei der sechs Artefakte.

Derzeit, wenn ich versuche, etwas ähnliches in Gradle zu tun, werden die Ausschlüsse ignoriert und alle sechs Artefakte heruntergeladen.

compile (group:"dep.location", name:"example", version:"7.3") 
{ 
    exclude module:'foo-1-0-xml' 
    exclude module:'bar-1-0' 
    exclude module:'bar-1-0-async' 
    exclude module:'bar-1-0-xml' 
} 

Ich benutze Gradle Version 1.8.

+0

Die Dinge, die Sie auszuschließen versuchen, sind Artefakte, keine Module. Die einzige unterstützte Methode zum Einschließen/Ausschließen von Artefakten in Gradle, die mir bekannt ist, ist der Typ, was hier nicht hilft. –

+0

Dies wird in Gradle nicht unterstützt. Aber eine Alternative ist die Änderung, wie Sie in Artefakte veröffentlichen. Warum beginnen Sie nicht, einzelne Jar-Dateien in Artefakte zu veröffentlichen? – vkg

+0

Okay, danke. – bhumphrey

Antwort

3

Ich glaube nicht, Gradle hat keine eingebaute Unterstützung für dies zu erreichen, aber Sie können die Artefakte aus dem Klassenpfad selbst reinigen.

Inspiriert von this thread auf den Gradle Foren kam ich mit auf den Punkt:

// The artifacts we don't want, dependency as key and artifacts as values 
def unwantedArtifacts = [ 
    "dep.location:example": [ "foo-1-0-xml", "bar-1-0", "bar-1-0-async", "bar-1-0-xml"], 
] 

// Collect the files that should be excluded from the classpath 
def excludedFiles = configurations.compile.resolvedConfiguration.resolvedArtifacts.findAll { 
    def moduleId = it.moduleVersion.id 
    def moduleString = "${moduleId.group}:${moduleId.name}:${moduleId.version}" // Construct the dependecy string 
    // Get the artifacts (if any) we should remove from this dependency and check if this artifact is in there 
    it.name in (unwantedArtifacts.find { key, value -> moduleString.startsWith key }?.value) 
}*.file 

// Remove the files from the classpath 
sourceSets { 
    main { 
     compileClasspath -= files(excludedFiles) 
    } 
    test { 
     compileClasspath -= files(excludedFiles) 
    } 
} 

Beachten Sie, dass Gradle wahrscheinlich noch die Dateien herunterladen und sie für Sie cachen, aber sie sollten in Ihrem Classpath nicht sein.

+0

Gradle hat Unterstützung eingebaut. Es ist "Lösungsstrategie" – smilyface

+0

Ich bin mir nicht sicher, ob Sie die Auflösungsstrategie verwenden können, um zu ändern, welche Artefakte aufgelöst werden. – Raniz

1

Ich bin nicht sicher, ob dies das ist, was Sie wollen, aber da wir Spring Boot und Wildfly verwenden, müssen wir das Tomcat-Starter-Modul aus dem Spring Boot Standard-Paket entfernen, und es sieht sehr ähnlich aus habe getan. Doch unser Code lautet:

configurations { 
    compile.exclude module: "spring-boot-starter-tomcat" 
} 

Ich habe nicht, wenn das entsprechende Glas nicht heruntergeladen oder einfach nicht auf dem Classpath geprüft, ich weiß aber, dass es nicht mehr verwendet wird.

Verwandte Themen