android - 使用 javadocs 将库项目编译为带有 gradle 的 jar

标签 android gradle android-gradle-plugin jcenter

我目前正在尝试将我的库项目编译成一个还包含 javadoc 的 .jar 文件,并取得了一些成功。

当我在我的 build.gradle 文件中包含 compile 'com.squareup:otto:1.3.8' 时,我最终得到了我想要的我自己的库。当我将鼠标悬停在库中的函数上时,我看到了它们包含的 javadoc,它是一个 .jar 文件。

我当前的代码编译得很好,但我最终得到一个 .aar 文件(尽管我的库项目中没有任何资源),而且我也没有包含 javadoc(尽管它们是在项目中编写的)。

我当前的 build.gradle 代码:

apply plugin: 'com.android.library'
apply plugin: 'maven'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 23
        versionCode 1
        versionName "0.3.5"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    lintOptions {
        abortOnError false
    }
}

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

def groupId = 'com.moonbloom'
def artifactId = 'boast'
def version = '0.3.5'

def localReleaseDest = "${buildDir}/release/${version}"

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

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

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

uploadArchives {
    repositories.mavenDeployer {
        pom.groupId = groupId
        pom.artifactId = artifactId
        pom.version = version
        // Add other pom properties here if you want (developer details / licenses)
        repository(url: "file://${localReleaseDest}")
    }
}

task zipRelease(type: Zip) {
    from localReleaseDest
    destinationDir buildDir
    archiveName "release-${version}.zip"
}

task generateRelease << {
    println "Release ${version} can be found at ${localReleaseDest}/"
    println "Release ${version} zipped can be found ${buildDir}/release-${version}.zip"
}

generateRelease.dependsOn(uploadArchives)
generateRelease.dependsOn(zipRelease)

artifacts {
    archives androidSourcesJar
    archives androidJavadocsJar
}

然后我只需运行“gradlew clean build generateRelease”,最后得到一个 .zip 文件,我可以上传到 JCenter(工作正常)。

我不久前在 StackOverflow 上找到了这段代码,但我似乎无法对其进行编辑以按我想要的方式工作,而且我似乎找不到其他正常工作的示例。

我不需要自动上传到 Bintray(因为我已经看过很多指南)。

这是我当前上传的库:
https://bintray.com/moonbloom/android/Boast/v0.3.5#files

这是 Otto,如我所愿:
https://bintray.com/bintray/jcenter/com.squareup%3Aotto/1.3.8/view#files

我希望这里有人能帮助我。

最佳答案

我必须承认,我设法以一种老掉牙的方式解决了我的问题。

我有我的原始代码(它创建了库 .aar 文件和 sources/javadocs .jar 文件)
我找到了一些可以创建我的库 .jar 文件的附加代码。
然后我自己编写了一些代码,将库 .jar 文件移动到正确的文件夹并删除了一些不需要的文件。
而且我还发现了一些代码可以轻松地将所有 gradle 函数变成一个简单的函数(这比我想象的要难)。

这最终得到一个完美的 .zip 文件,可以轻松上传到 jcenter,当我通过 gradle 下载它时,javadocs 工作完美。

只需运行“gradlew all”,它就会完成所有工作。

我的代码如下所示,如果有人和我有同样的问题:

apply plugin: 'com.android.library'
apply plugin: 'maven'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 23
        versionCode 1
        versionName "0.4.1"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    lintOptions {
        abortOnError false
    }
}

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

def identifier = "com"
def name = "testname"

def groupId = "${identifier}.${name}"
def artifactId = "libraryname"
def version = "0.4.1"

def localReleaseDest = "${buildDir}/release/${version}"
def nearFullPath = "${localReleaseDest}/${identifier}/${name}/${artifactId}"
def fullPath = "${nearFullPath}/${version}"

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

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

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

task makeJar(type: Copy) {
    from("build/intermediates/bundles/release/")
    into("${fullPath}/")
    include("classes.jar")
    rename ("classes.jar", "${artifactId}-${version}.jar")

    doLast {
        println "- '${artifactId}-${version}.jar' has been built"
    }
}

uploadArchives {
    repositories.mavenDeployer {
        pom.groupId = groupId
        pom.artifactId = artifactId
        pom.version = version

        repository(url: "file://${localReleaseDest}")
    }
}

task removeUnwantedFiles(type: Delete) {
    delete fileTree(dir: "${nearFullPath}/", include: ["*.md5", "*.sha1", "*.aar"])
    delete fileTree(dir: "${fullPath}/", include: ["*.md5", "*.sha1", "*.aar"])

    doLast {
        println "- Unwanted files have been removed in these folders:"
        println "--- ${nearFullPath}"
        println "--- ${fullPath}"
    }
}

task zipRelease(type: Zip) {
    from localReleaseDest
    destinationDir buildDir
    archiveName "${artifactId}-${version}.zip"

    doLast {
        println "- Release ${version} can be found at ${localReleaseDest}/"
        println "- Release ${version} zipped can be found ${buildDir}/release-${version}.zip"
    }
}

artifacts {
    archives androidSourcesJar
    archives androidJavadocsJar
}

def buildAliases = [
        'all' : ['clean', 'build', 'makeJar', 'uploadArchives', 'removeUnwantedFiles', 'zipRelease']
]

def expandedTaskList = []

gradle.startParameter.taskNames.each {
    expandedTaskList << (buildAliases[it] ? buildAliases[it] : it)
}

gradle.startParameter.taskNames = expandedTaskList.flatten()

println "Following tasks have been run: ${gradle.startParameter.taskNames}"

关于android - 使用 javadocs 将库项目编译为带有 gradle 的 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32555398/

相关文章:

android - Facebook 的屏幕截图测试失败,api 大于 23

testing - gradle 编译但不运行测试

android - gradle uploadArchives 任务上传单一口味

Android 测试依赖于库项目上的测试类

Android Studio 无法在 gradle 上设置 Jackson Parser

android - Textview 在第一次点击时为空,但在第二次点击时更新

Android ImageButton 如何拥有比图像本身更大的可点击区域?

android - 改造 : java. lang.IllegalStateException: 关闭

Android 依赖项 'com.android.support:support-compat' 具有不同版本的编译 (25.1.0) 和运行时 (25.3.0) 类路径

android - 在 jCenter 中分发 Android 库以在 gradle 中使用