在Gradle中获取JavaDoc jar以获取依赖项

时间:2017-02-24 13:27:51

标签: gradle gradle-eclipse

我正在处理Gradle任务,以便为基于Eclipse的IDE创建项目。这需要生成.project.classpath文件。这部分绝对没问题,我可以通过apply plugin: 'eclipse'使用Gradle Eclipse插件,让我的任务依赖eclipseProjecteclipseClasspath配置更改。但是另外一个要求是,整个项目必须是可移植的(甚至是没有Gradle的环境),因此不可能只定义外部依赖项,因为类路径将引用缓存。我通过使用定义依赖项的主项目解决了这个问题:

// 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 - 依赖项的jar。在使用本地副本之前,我只需使用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,如果a),:javadoc分类器后缀的依赖关系定义为常规依赖关系或b)不复制依赖关系,但是使用Eclipse插件(带downloadJavadoc = true)的项目直接引用。

1 个答案:

答案 0 :(得分:1)

即使我认为,我需要更改构建文件的结构,我找到了针对这个特定案例的解决方案,所以我想为可能偶然遇到同样问题的其他人提供解决方案。

我找到了ArtifactResolutionQuery,它可以解析其他所需的JAR(Javadoc和源代码),所以我写了一个任务来复制那些JAR。

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