多模块项目中的Javadoc生成"错误包不存在"

Vig*_*dar 3 android javadoc gradle-dependencies

我需要通过Bintray将我的库(多模块项目)上传到sonatype存储库.所以我需要为每个模块单独生成Javadoc.

首先,我遇到了这些类似问题中的问题

Android Studio Javadoc:找不到符号

Gradle Javadoc失败,出现"错误:包...不存在"

从第一个问题的解决方案,我可以解决我从第三方库(retrofit2,gson)和@NonNull注释错误使用的类.

但在我的情况下,我的一个模块(Lib2)依赖于另一个模块(Lib1).

生成Lib2模块的Javadoc时,它的警告package does not existcannot find symbol另一个模块的类(Lib1).

并且这两个模块都报告package does not exist了android支持和设计库的错误.

每一个import <packagename>.R;报道cannot find symbol

我的Javadoc生成任务

task androidJavadocs(type: Javadoc) {
      source = android.sourceSets.main.java.source
      classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
      ext.androidJar ="${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
      classpath += files(ext.androidJar)
      project.android.libraryVariants.all { variant ->
        classpath += files(variant.javaCompile.classpath.files)
      }
}
Run Code Online (Sandbox Code Playgroud)

Lib1中的依赖项 build.gradle

compile rootProject.appcompat
compile rootProject.design
compile rootProject.retrofit2
compile rootProject.support
compile rootProject.gsonConverter
compile rootProject.httpLogInterceptor
compile rootProject.universalImageLoader
Run Code Online (Sandbox Code Playgroud)

Lib2中的依赖项 build.gradle

compile project(':core')
compile rootProject.appcompat
compile rootProject.design
compile rootProject.retrofit2
compile rootProject.support
compile rootProject.cardview
Run Code Online (Sandbox Code Playgroud)

我试过了

task androidJavadocs(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

afterEvaluate {
    androidJavadocs.classpath += project.android.libraryVariants.toList().first().javaCompile.classpath
}
Run Code Online (Sandbox Code Playgroud)

我的全部 gradle-mvn-push.gradle

apply plugin: 'maven'
apply plugin: 'com.jfrog.bintray'
// Declaring variables

afterEvaluate {  project ->
  bintray {
    user = bin_user
    key = bin_key
    configurations = ['archives']
    publish = true
    dryRun = false
    pkg {
      repo = REPO
      name = POM_ARTIFACT_ID
      userOrg = USER_ORG
      desc = POM_DESCRIPTION
      websiteUrl = POM_URL
      vcsUrl = GIT_URL
      licenses = ['Apache-2.0']
      version {
        name = VERSION_NAME
        vcsTag = VERSION_NAME
        gpg {
          sign = true
          try {
            passphrase = PASS_PHRASE
          } catch (Exception ignored) {
            println 'Failed to find credentials. GPG sign disabled'
          }
        }
      }
    }
  }

  if (project.getPlugins().hasPlugin('com.android.application') ||
          project.getPlugins().hasPlugin('com.android.library')) {
    task install(type: Upload, dependsOn: assemble) {
      repositories.mavenInstaller {
        configuration = configurations.archives

        pom.groupId = GROUP
        pom.artifactId = POM_ARTIFACT_ID
        pom.version = VERSION_NAME

        pom.project {
          name POM_NAME
          packaging POM_PACKAGING
          description POM_DESCRIPTION
          url POM_URL

          scm {
            url POM_SCM_URL
            connection POM_SCM_CONNECTION
            developerConnection POM_SCM_DEV_CONNECTION
          }

          licenses {
            license {
              name POM_LICENCE_NAME
              url POM_LICENCE_URL
              distribution POM_LICENCE_DIST
            }
          }

          developers {
            developer {
              id pom_developer_id
              name pom_developer_name
            }
          }

        }

        pom.withXml {
          def dependenciesNode = asNode().appendNode('dependencies')

          //Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each
          configurations.compile.allDependencies.each {
            def dependencyNode = dependenciesNode.appendNode('dependency')
            dependencyNode.appendNode('groupId', it.group)
            dependencyNode.appendNode('artifactId', it.name)
            dependencyNode.appendNode('version', it.version)
          }
        }
      }
    }

    task androidJavadocs(type: Javadoc) {
      source = android.sourceSets.main.java.source
      classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
      ext.androidJar ="${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
      classpath += files(ext.androidJar)
      project.android.libraryVariants.all { variant ->
        classpath += files(variant.javaCompile.classpath.files)
      }
    }

    task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
      classifier = 'javadoc'
      from androidJavadocs.destinationDir
    }

    task androidSourcesJar(type: Jar) {
      classifier = 'sources'
      from android.sourceSets.main.java.source
    }


  } else {
    install {
      repositories.mavenInstaller {
        pom.groupId = GROUP
        pom.artifactId = POM_ARTIFACT_ID
        pom.version = VERSION_NAME

        pom.project {
          name POM_NAME
          packaging POM_PACKAGING
          description POM_DESCRIPTION
          url POM_URL

          scm {
            url POM_SCM_URL
            connection POM_SCM_CONNECTION
            developerConnection POM_SCM_DEV_CONNECTION
          }

          licenses {
            license {
              name POM_LICENCE_NAME
              url POM_LICENCE_URL
              distribution POM_LICENCE_DIST
            }
          }

          developers {
            developer {
              id POM_DEVELOPER_ID
              name POM_DEVELOPER_NAME
            }
          }
        }
      }
    }

    task sourcesJar(type: Jar, dependsOn:classes) {
      classifier = 'sources'
      from sourceSets.main.allSource
    }

    task javadocJar(type: Jar, dependsOn:javadoc) {
      classifier = 'javadoc'
      from javadoc.destinationDir
    }
  }

  if (JavaVersion.current().isJava8Compatible()) {
    allprojects {
      tasks.withType(Javadoc) {
        options.addStringOption('Xdoclint:none', '-quiet')
      }
    }
  }

  artifacts {
    if (project.getPlugins().hasPlugin('com.android.application') ||
            project.getPlugins().hasPlugin('com.android.library')) {
      archives androidSourcesJar
      archives androidJavadocsJar
    } else {
      archives sourcesJar
      archives javadocJar
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Vig*_*dar 12

我使用下面的代码解决了这个问题

task androidJavadocs(type: Javadoc, dependsOn: 'assembleRelease') {
  classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
  android.libraryVariants.all { variant ->
    if (variant.name == 'release') {
      owner.classpath += variant.javaCompile.classpath
    }
  }
  source = android.sourceSets.main.java.srcDirs
  exclude '**/R.html', '**/R.*.html', '**/index.html'
}
Run Code Online (Sandbox Code Playgroud)

但仍有import <packagename>.R;报道cannot find symbol.

参考文献:

使用Javadocs进行冒险,第2部分(介绍Android框架类)

与Javadocs的冒险,第3部分(从第三方依赖介绍类)

  • 你不需要排除`'**/R.html'`,而是排除`'**/R.java'`,因为`exclude`会排除要处理的源文件夹中的文件,而不是输出. (2认同)