在Android中包含带有Java源代码的jar文件

时间:2017-01-10 13:26:33

标签: java android gradle android-gradle

我有一个gradle任务来创建一个包含Java 源文件的jar文件,以包含在Android aar库包中。这些文件将作为JNI的Javadoc,也可以作为捆绑在aar包中的C ++库。

我无法弄明白如何包含 jar文件,而不是编译其中的文件。似乎jar文件中的Java文件是编译的,这对我没有帮助 - 我只想包含它们,以便开发人员可以使用该aar包

创建的jar文件包含所有源代码,并且位于其libs目录中的输出中,但它没有内容。

如何将Java源添加到我的aar?

Jar创建

Jar创建如下,最终位于我模块的build/libs文件夹中。

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

artifacts {
    archives generateMySources
}

preBuild.dependsOn(":myModule:generateMySources")

dependencies {
    // The jar is included but it is empty inside the aar.
    compile files('build/libs/myModule-sources.jar')
}

输出jar包含:

.
├── com
│   └── my
│       └── app
│           └── jni
│               ├── File1.java
│               ├── File2.java
│               ├── File3.java
│               └── File4.java
└── META-INF
    └── MANIFEST.MF // Contains "Manifest-Version: 1.0" only.

jar存在于libs目录内的aar内部,但现在它是空的。

2 个答案:

答案 0 :(得分:2)

我唯一想到的就是在你的内容构建完成之后将你的源添加到.aar文件中

task generateMySources(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs
}
task addMySourcesToAar(type: Jar) {
    archiveName "myModuleWithSources.aar"
    destinationDir file("build")
    from zipTree("build/outputs/aar/myModule-release.aar")
    from fileTree("build").include("libs/myModule-sources.jar")
}
afterEvaluate { project ->
    project.tasks.preBuild.dependsOn generateMySources
    project.addMySourcesToAar.dependsOn build
}
artifacts {
    archives addMySourcesToAar.archivePath
}

并运行

./gradlew myModule:addMySourcesToAar

我没有像你那样向依赖项添加任何东西

答案 1 :(得分:2)

因此,谁在使用Gradle Kotlin DSL:

tasks.register<Jar>(name = "sourceJar") {
    from(android.sourceSets["main"].java.srcDirs)
    classifier = "sources"
}

publishing {
    publications {
        create<MavenPublication>(name = "Maven") {
            run {
                groupId = "groupId"
                artifactId = "module-name"
                version = "1.0"
                artifact("$buildDir/outputs/aar/module-name-release.aar")
                artifact(tasks["sourceJar"])
            }
        }
    }
}