2017-02-24 53 views
0

我正在爲Gradle任務創建基於Eclipse的IDE的項目。這需要生成.project.classpath文件。這部分是絕對沒有問題的,我可以通過apply plugin: 'eclipse'使用Gradle Eclipse插件,讓我的任務依賴於配置改變的eclipseProjecteclipseClasspath。但是另一個要求是,整個項目必須是可移植的(即使是沒有Gradle的環境),所以不可能定義外部依賴關係,因爲類路徑將引用緩存。我用一個主項目定義的依賴關係解決了這個問題:獲取用於Gradle中的依賴關係的JavaDoc jar

// Define configurations 
configurations { 
    libs 
} 

// Define repositories 
repositories {                
    mavenCentral() 
} 

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

這些依賴就會被下載到緩存中,並把它們簡單的複製任務複製到我的項目'lib'文件夾:

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

一子項目現在使用的複製庫的依賴關係,簡單地使用:

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

在子項目另外一個任務相對化的路徑,所以我可以移動我的項目並根據需要隨時撥打gradle build。這是類路徑的外觀:

<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> 

現在我想包含javadoc -jars的依賴關係。使用本地副本之前,我可以簡單地使用this Eclipse plugin feature

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

但現在我的項目使用文件作爲依賴關係,因此Eclipse插件不能只是簡單的要求Javadoc文件了。我如何要求下載javadoc -jars 而不使用每次都添加第二個依賴關係,:javadoc分類器後綴?一旦它被下載了,我可以在緩存中查找它自己,也把它添加到.classpath以預想方式:,

<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> 

但在此刻,javadoc -jars只下載如果)的依賴:javadoc分類器後綴的定義與常規依賴類似,或者b)不會複製依賴關係,而是直接通過Eclipse插件(具有downloadJavadoc = true)的項目引用。

+0

對於沒有安裝Gradle的環境,您不能使用Gradle包裝器嗎? –

回答

0

即使我認爲,我需要更改構建文件的結構,我發現了針對這種特定情況的解決方案,所以我想爲其他可能遇到同樣問題的人提供此解決方案。

我發現了ArtifactResolutionQuery,它可以解析其他所需的JAR(Javadoc和sources),所以我寫了一個任務來複制這些JAR。

// 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" 
}