使用Android插件获取gradle项目的classpath

时间:2015-01-29 19:15:15

标签: android gradle android-gradle build.gradle

我一直在为gradle多项目构建构建一些任务,并且需要获取项目的类路径。构建脚本包含使用Java插件的项目和使用Android插件的项目。

对于Java项目,我能够使用最高投票答案in this question来使用configurations.runtime.asPath获取类路径;但是,这不适用于Android项目,因为没有configurations.runtime属性。

如何使用Android插件为gradle项目生成类路径?

4 个答案:

答案 0 :(得分:2)

Android项目可能会构建多个版本的应用。这些被称为变体。最基本的变体是“debug”和“release”以下代码应该为项目中的所有变体创建类路径分配。将此代码放在模块的“build.gradle”文件中。

android.applicationVariants.each { variant ->
    variant.javaCompile.classpath += configurations.provided
}

您应该能够使用变体名称来引用特定变体:

debug.javaCompile.classpath

答案 1 :(得分:2)

这是一个gradle任务,它生成模块jar并包含所有变体的测试类路径。 它包括库和选定运行时的android.jar。

我已经添加了两个命令行执行来更新emacs中的一些env var并杀死任何正在运行的beanshell(使用以前的类路径)。

task classpath(type: Jar) {
  from android.sourceSets.main.java.srcDirs,
       android.sourceSets.test.java.srcDirs
  outputs.upToDateWhen { false }
  doLast {
    println "Building classpath..."
    def cp2 = [android.getBootClasspath()[0], it.archivePath]
    android.applicationVariants.all { v ->
      cp2 += v.getApkLibraries()
    }
    def classpath = cp2.unique().join(":")
    println "Updating emacs..."
    exec {
      executable "sh"
      args "-c", "emacsclient --eval '(setenv \"CLASSPATH\" \""+classpath+"\")'"
    }
    exec {
      executable "sh"
      args "-c", "emacsclient --eval '(jdee-bsh-exit)'"
    }
  }
}

请注意我使用":"加入classpath

答案 2 :(得分:0)

project.android.applicationVariants.all { v ->
            v.getCompileClasspath(null).getFiles().each{
                File f->
                    f.getAbsolutePath()//this is the one of classpath
            }
        }

答案 3 :(得分:0)

这是gradle任务的另一个示例,该任务在android项目中使用umlgraph + graphiz生成javadocs,并使用user1737310上一个答案中给出的编码示例,包括所有变体的类路径。它是从选定的运行时手动添加的android.jar,但我仍在寻找一种动态检索它的方法。

    task javadoc(dependsOn: build) {
    setDescription('Generates Javadoc API documentation with UMLGraph diagrams')
    setGroup(JavaBasePlugin.DOCUMENTATION_GROUP)

    doLast {
        def javaFilePath = file('src/main/java')
        def cp = [System.getenv('ANDROID_HOME')+'/platforms/android-26/android.jar'];
        project.android.applicationVariants.all { v ->
            v.getCompileClasspath(null).getFiles().each{
                File f->
                    cp.add(f.getAbsolutePath())//this is the one of classpath
            }
        }
        def classpath = ":"+cp.join(':')
        if (javaFilePath.exists()) {
            ant.javadoc(classpath: (configurations.umljavadoc).asPath + classpath, 
                        sourcepath: file('src/main/java'), 
                        packagenames: '*',
                        destdir: "${docsDir}/javadoc",
                        private: 'false',
                        docletpath: configurations.umljavadoc.asPath) {
                doclet(name: 'org.umlgraph.doclet.UmlGraphDoc') {
                    param(name: '-inferrel')
                    param(name: '-inferdep')
                    param(name: '-qualify')
                    param(name: '-postfixpackage')
                    param(name: '-hide', value: 'java.*')
                    param(name: '-collpackages', value: 'java.util.*')
                    param(name: '-nodefontsize', value: '9')
                    param(name: '-nodefontpackagesize', value: '7')
                    param(name: '-link', value: 'http://java.sun.com/j2se/1.5.0/docs/guide/javadoc/doclet/spec')
                    param(name: '-link', value: 'http://java.sun.com/j2se/1.5/docs/api')
                }
            }
        }
    }
}

`