2017-02-24 2 views
0

Ich arbeite an einem Gradle-Task, um ein Projekt für eine IDE basierend auf Eclipse zu erstellen. Dazu müssen sowohl eine .project als auch eine .classpath Datei generiert werden. Dieser Teil ist absolut kein Problem und ich kann das Gradle Eclipse Plugin über apply plugin: 'eclipse' verwenden, um meine Aufgabe von eclipseProject und eclipseClasspath mit geänderten Konfigurationen abhängig zu machen. Eine zusätzliche Anforderung besagt jedoch, dass das gesamte Projekt portierbar sein muss (selbst in Umgebungen ohne Gradle). Daher ist es nicht möglich, nur die externen Abhängigkeiten zu definieren, da sich der Klassenpfad auf den Cache bezieht. Ich löste dieses Problem, indem ein Hauptprojekt definiert, die Abhängigkeiten mit:Erhalten Sie JavaDoc-Jars für Abhängigkeiten in Gradle

// Define configurations 
configurations { 
    libs 
} 

// Define repositories 
repositories {                
    mavenCentral() 
} 

// Include dependencies via 'groupID:artifactID:version[:classifier]' 
dependencies { 
    libs 'junit:junit:4.12' 
} 

Diese Abhängigkeiten in den Cache heruntergeladen werden, und eine einfache Kopie Aufgabe kopiert sie in meinem Projekt 'lib' Ordner:

// Copies the dependencies to project 'lib' folder 
task copyLibs(type: Copy) { 
    from configurations.libs 
    into "$projectDir/$projectName/lib" 
} 

A Teilprojekt nutzt nun diese kopiert Bibliotheken als Abhängigkeiten, einfach mit:

dependencies { 
    compile fileTree(dir: 'lib', include: ['*.jar']) 
} 

Eine zusätzliche Aufgabe im Teilprojekt der Pfade relativiert, so dass ich kann mein Projekt verschieben und gradle build anrufen, wo ich will. Dies ist, wie die Classpath aussieht:

<classpath> 
    <classpathentry path="bin" kind="output"/> 
    <classpathentry kind="src" path="src"/> 
    <classpathentry kind="lib" path="lib\hamcrest-core-1.3.jar"/> 
    <classpathentry kind="lib" path="lib\junit-4.12.jar"/> 
</classpath> 

Jetzt will ich die javadoc -jars der Abhängigkeiten enthalten. Bevor die lokalen Kopien verwenden, könnte ich einfach this Eclipse plugin feature verwenden:

eclipse { 
    classpath { 
     downloadJavadoc = true 
     downloadSources = true 
    } 
} 

Aber jetzt mein Projekt verwendet, um Dateien als Abhängigkeiten, so kann die Eclipse-Plugin nicht nur einfach die Javadoc Dateien anfordern, auch. Wie kann ich den Download der javadoc -jars ohne anfordern, die jedes Mal eine zweite Abhängigkeit mit dem :javadoc Suffix hinzufügt? Sobald es heruntergeladen wird, kann ich es im Cache selbst suchen und fügen Sie es auch auf die .classpath in der vorgesehenen Art und Weise:

<classpathentry kind="lib" path="lib\junit-4.12.jar"> 
    <attributes> 
    <attribute name="javadoc_location" value="jar:platform:/path/to/javadoc/junit-4.12-javadoc.jar"/> 
    </attributes> 
</classpathentry> 

Aber im Moment, die javadoc -jars nur heruntergeladen werden, wenn a) die Abhängigkeit mit dem :javadoc Klassifikator-Suffix wird genau wie die reguläre Abhängigkeit definiert oder b) die Abhängigkeiten werden nicht kopiert, sondern direkt von einem Projekt mit dem Eclipse-Plugin referenziert (mit downloadJavadoc = true).

+0

In Umgebungen, in denen Gradle nicht installiert ist, können Sie den Gradle-Wrapper nicht verwenden? –

Antwort

0

Auch wenn ich denke, dass ich die Struktur meiner Build-Datei ändern muss, habe ich eine Lösung für diesen speziellen Fall gefunden, also möchte ich es für andere bereitstellen, die über das gleiche Problem stolpern könnten.

Ich fand die ArtifactResolutionQuery, die zusätzliche erforderliche JARs (Javadoc und Quellen) auflösen kann, also schrieb ich eine Aufgabe, diese JARs auch zu kopieren.

// Copies the javadoc files to project 'lib/javadoc' folder 
task copyJavadocs(type: Copy) { 
    from { 
     dependencies.createArtifactResolutionQuery() 
      .forComponents(
       configurations.libs.incoming.resolutionResult 
        .allDependencies.collect { it.selected.id } 
      ) 
      .withArtifacts(JvmLibrary, JavadocArtifact) 
      .execute() 
      .resolvedComponents 
      .collectMany { 
       it.artifactResults 
        .collect { it.file.path } 
      } 
    } 
    into "$projectDir/$sunriseProjectName/lib/javadoc" 
} 
Verwandte Themen