【问题标题】:Generate JavaDocs with Android Gradle plugin使用 Android Gradle 插件生成 JavaDocs
【发布时间】:2013-06-06 16:46:26
【问题描述】:

如何使用新的 Gradle 构建系统为 Android 项目生成 JavaDocs?

这是我想出的,但它不起作用。

task generateJavadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    ext.cp = android.libraryVariants.collect { variant ->
        variant.javaCompile.classpath.files
    }
    classpath = files(ext.cp) 
}

主要问题是我没有在类路径上获得适当的 android.jar,因此 JavaDocs 中的某些链接没有得到解决。我必须想办法在类路径中获取所有必要的 jar。

我采用的方法的另一个问题是它收集所有构建变体的类路径,而不是选择一个。

【问题讨论】:

标签: android gradle javadoc android-gradle-plugin


【解决方案1】:

这是 2014 年使用的更新版本:

android.libraryVariants.all { variant ->
    def name = variant.buildType.name

    if (name.equalsIgnoreCase("debug")) {
        return; // Skip debug builds.
    }
    task("javadoc${variant.name.capitalize()}", type: Javadoc) {
        description "Generates Javadoc for $variant.name."
        source = variant.javaCompile.source
        ext.androidJar = files(plugins.findPlugin("com.android.library").getBootClasspath())
        classpath = files(variant.javaCompile.classpath.files) + ext.androidJar
        exclude '**/internal/**'
        failOnError false
    }

    task("bundleJavadoc${variant.name.capitalize()}", type: Jar) {
        description "Bundles Javadoc into zip for $variant.name."
        classifier = "javadoc"
        from tasks["javadoc${variant.name.capitalize()}"]
    }
}

【讨论】:

  • plugins.findPlugin("com.android.library").getBootClasspath() 使用 Gradle 2.3、Gradle Android 插件 1.2.3 对我来说失败了。但是当我删除整个 ext.androidJar 行(以及使用它的行)时它起作用了。
【解决方案2】:

使用 android gradle tools 1.10.+ 获取 android SDK 目录与以前不同。您必须更改以下内容:

android.sdkDirectory 

而不是

android.plugin.sdkDirectory

这是问题的完整解决方案:

android.applicationVariants.all { variant ->

    task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
        title = "Documentation for Android $android.defaultConfig.versionName b$android.defaultConfig.versionCode"
        destinationDir = new File("${project.getProjectDir()}/doc/compiled/", variant.baseName)
        source = variant.javaCompile.source

        ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
        classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)

        description "Generates Javadoc for $variant.name."

        options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PRIVATE
        options.links("http://docs.oracle.com/javase/7/docs/api/");
        options.links("http://developer.android.com/reference/");
        exclude '**/BuildConfig.java'
        exclude '**/R.java'
    }
}

【讨论】:

  • 只需使用android.sdkDirectory 而不是android.plugin.sdkDirectory (plus.google.com/114432517923423045208/posts/NphSRvqAo6m)
  • 我不得不忽略 R.java 文件的排除,否则我确实得到了很多错误,但这也是对我有用的解决方案。
  • 谢谢,请注意它必须是options.links("https://developer.android.com/reference/") 而不是options.links("https://developer.android.com/reference/reference")
【解决方案3】:

还有一个

android.libraryVariants.all { 变体 -> if(variant.name.equals('release')) 任务(“生成Javadoc”,类型:Javadoc){ 描述“生成 Javadoc” 源 = android.sourceSets.main.java.srcDirs // println '=== source ===' // source.collect { relativePath(it) }.sort().each { println it } ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar" 类路径 = 文件(variant.javaCompile.classpath.files)+ 文件(ext.androidJar) // println '=== 类路径 ===' // classpath.collect { relativePath(it) }.sort().each { println it } } }

用途:

gradle 生成Javadoc

【讨论】:

    【解决方案4】:

    我为此制作了一个开源插件。 GitHub Repository

    buildscript {
        repositories {
            maven {
                url "https://plugins.gradle.org/m2/"
            }
        }
        dependencies {
            classpath "gradle.plugin.com.vanniktech:gradle-android-javadoc-plugin:0.2.1"
        }
    }
    

    将此行添加到您的 build.gradle

    apply plugin: "com.vanniktech.android.javadoc"
    

    然后只需执行以下操作之一:

    ./gradlew generateDebugJavadoc
    ./gradlew generateReleaseJavadoc
    

    java文档可以在module/javaDoc/找到

    【讨论】:

      【解决方案5】:

      如果您有不同的产品风格,我发现此解决方案适用于 Gradle 插件 1.3.1。

      这将创建 Gradle 任务来为每种产品风格和构建类型生成 Javadoc。例如,如果模块名称是 app,并且您有 productiondev 产品风格以及 debugrelease 构建类型,您将拥有以下 Gradle 任务:

      • :app:generateDevDebugJavadoc
      • :app:generateDevReleaseJavadoc
      • :app:generateProductionDebugJavadoc
      • :app:generateProductionReleaseJavadoc

      app/build.gradle

      android {
      
          // ...
      
          applicationVariants.all { variant ->
              // create tasks to generate Javadocs
              task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
                  source = variant.javaCompile.source
                  classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
      
                  // choose the destination that works best for you here
                  // I chose this particular directory because Jenkins pulls reports 
                  // from this directory already if you need to have the output 
                  // folder be parameterized for the build variant, use
                  // "build/outputs/docs/javadoc-${variant.name}/" instead and it'll 
                  // be in `javadoc-productionRelease` for example
                  destinationDir = file("build/outputs/docs/javadoc/")
      
                  // the name that will appear in the docs
                  title = rootProject.name
      
                  // you will probably get errors from using the @annotations and 
                  // the support library, so just turn off failing for errors
                  failOnError false    
              }
          }
      
          // ...
      
      }
      

      【讨论】:

        【解决方案6】:

        适用于 Android gradle 插件 1.1.2+ (com.android.tools.build:gradle:1.1.2+)

        libraryVariants - 不再工作了

        使用:

        task javadoc(type: Javadoc) {
            source = android.sourceSets.main.java.srcDirs
            classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
            destinationDir = file("../javadoc/")
            failOnError false
        }
        

        destinationDir = file("../javadoc/") - 将 javadocs 定位到项目目录的根目录(这样 jenkins javadoc 插件可以找到它并显示在特殊的文档面板中)

        failOnError false - 用于抑制可能导致 jenkins 构建失败的警告

        【讨论】:

        • +1 绝对的天才!!!我见过的每种为 aars 创建 javadocs 的方法(示例都在这个 SO q 上)都使用 .all 方法,该方法冗长且不能从其他消耗任务中调用。这种方法非常干净和实用。
        • Gradle 说“无法添加任务 ':mossosdesign:javadoc',因为具有该名称的任务已经存在。”
        【解决方案7】:

        Gradle 1.11 - Gradle 插件 0.10.0

        android.plugin.sdkDirectory 替换为android.sdkDirectory

        android.libraryVariants.all { variant ->
            task("generate${variant.name}Javadoc", type: Javadoc) {
                description "Generates Javadoc for $variant.name."
                source = variant.javaCompile.source
                ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
                classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)
                options.links("http://docs.oracle.com/javase/7/docs/api/");
                options.links("http://d.android.com/reference/");
                exclude '**/BuildConfig.java'
                exclude '**/R.java'
            }
        }
        

        【讨论】:

        • 有效,但我会使用 "generate${variant.name.capitalize()}Javadoc" 来获得格式更好的任务名称(例如,generateReleaseJavadocgeneratereleaseJavadoc)。
        • 我必须使用options.linksOffline("http://d.android.com/reference", "${android.plugin.sdkDirectory}/docs/reference"); 而不是options.links("http://d.android.com/reference/");。否则它会发出警告并且不会链接到 Android 文档。除此之外,它似乎工作得很好!
        • 比使用ext.androidJar 构建自己的android jar 路径更好的是简单地使用android.bootClasspathclasspath = files(variant.javaCompile.classpath.files) + files(android.bootClasspath)
        【解决方案8】:

        android jar 似乎在属性android.plugin.runtimeJarList 中。虽然它没有记录在任何地方,所以它可能随时中断。

        我已经改进了您的解决方案以跨构建变体工作:

        android.applicationVariants.all { variant ->
            def name = variant.name
            task "javadoc$name"(type: Javadoc) {
                description = "Generates javadoc for build $name"
                destinationDir = new File(destinationDir, variant.baseName)
                source = files(variant.javaCompile.source)
                classpath = files(android.plugin.runtimeJarList, variant.javaCompile.classpath)
                exclude '**/R.html', '**/R.*.html'
            }
        }
        

        通常只在主分支上编写 javadoc 是没有意义的,因为您可能会依赖产品风格中的某些东西。即使是调试与发布也可能存在一些差异。您当然可以选择使用默认变体。所以你可以做类似的事情,

        task javadoc(dependsOn: javadocDebug)
        

        【讨论】:

        • 自 AS 0.2.9 提示出现错误 Could not find property 'applicationVariants'
        • 哦,想通了,如果你正在构建一个库项目,你需要像 OP 一样使用android.libraryVariants
        • 编译解决方案后,未添加任何任务。似乎变体列表是空的,因为我已通过添加 this debug task 确认。任何想法可能是什么问题?
        • 嗯,这似乎对我有用。我将 applicationVariants 更改为 libraryVariants,它为我添加了一个 javadocDebug 任务。也许您应该更新 android 插件和/或 gradle?
        • R.java 文件可以在任务中使用以下行排除:exclude '**/R.html', '**/R.*.html'
        【解决方案9】:

        我最终确定的解决方案如下:

        android.libraryVariants.all { variant ->
        
            task("generate${variant.name}Javadoc", type: Javadoc) {
                description "Generates Javadoc for $variant.name."
                source = variant.javaCompile.source
                ext.androidJar = "${android.plugin.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
                classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)
            }
        
        }
        

        Xavier Ducrohet 在 adt-dev 小组https://groups.google.com/forum/#!searchin/adt-dev/javadoc/adt-dev/seRizEn8ICA/bafEvUl6mzsJ 上确认这是这样做的方法(带有警告)。

        【讨论】:

        • 如果你得到“javaCompile”在最新版本的android studio中被弃用,请改为“javaCompiler”
        • 如果你得到'variant.getJavaCompiler()'被弃用,使用variant.javaCompileProvider.get().sourcevariant.javaCompileProvider.get().classpath
        • [note] javadoc 已生成但为空。我使用的最终解决方案是source = android.sourceSets.main.java.srcDirs classpath += variant.javaCompileProvider.get().classpath
        • @istrocode 谢谢。我一直在努力替换我已弃用的​​电话,但尽管查看了几本指南,但没有明确的迹象表明您应该使用 TaskProvider.get()。这解决了我的问题。
        猜你喜欢
        • 2015-03-14
        • 2016-10-31
        • 2019-10-27
        • 2011-11-15
        • 2013-06-01
        • 2018-03-20
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多