Gradle获取源码sourceSets

在写gradle插件时可能会使用到源码文件,如作源码文件的版本对比,源码分析等,但源码如何来获取呢?一般gradle项目的源码默认都是在固定的位置,如project/app/src/main/java 。但源码的位置并非一定要在此,这只是一个默认位置,在Gradle的配置文件build.gradle里是可以配置源码的位置的,下面可以看下在Android和Java项目中是如何配置的。

配置源码位置

  • Android项目源码配置

Android源码配置是在android下面的sourceSets参数里进行配置。

apply 'com.android.application'
//apply 'com.android.library'
android {
    sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            res.srcDirs = ['src/main/res']
            assets.srcDirs = ['src/main/assets']
            jniLibs.srcDir(['Libs'])
        }
    }
}
  • Java项目源码配置

Java项目sourceSets与Android项目的不同,它在最外层直接配置。

apply 'java'
sourceSets {
    main {
        java {
            srcDirs = ['src/main/java']
        }
        resources {
            srcDirs = ['src/main/resources']
        }
    }
}

获取源码文件

我们知道在gradle的配置文件中,每个名称都是一个Extension,每个Extension可以配置指定的参数列表。如android{},是由AppPlugin通过project.getExtensions().create("android",AppExtension)来创建的,而AppExtension类的成员变量定义了gradle参数,如defaultConfig,productFlavors,buildTypes,signingConfigs等。然而事实并非如何,gradle里还有一种配置自定义参数的方式,即Convention。Convention方式中每个成员变量对应的是一个extension。其中Java项目中的sourceSets即是使用如何方式进行配置的。
下面看一下如何获取获取项目的源码。既然源码是通过自定义参数配置的,那么获取的时候通过拿到自定义的参数对象,获取其sourceSets字段即可。

  • Android项目获取sourceSets

android使用的是BaseExension对象配置的参数,所有通过Plugin获取到extension对象,取其中的sourceSets字段。

//Android项目
BaseExtension extension = project.getPlugins().getPlugin(AppPlugin).getExtension()
//Library项目
//BaseExtension extension = project.getPlugins().getPlugin(LibraryPlugin).getExtension()
extension.getSourceSets()
  • Java项目获取sourceSets

Java项目是通过Convention配置的,所以需要找到Convention对象,即JavaPluginConvention。通过此对象来获取Java项目的源码文件

Convention convention = project.getConvention()
JavaPluginConvention javaPluginConvention = convention.getPlugin(JavaPluginConvention)
SourceSet sourceSet = javaPluginConvention.getsourceSets()

注意Java项目创建了Jar任务用来打包,而Jar也有一个getSource方法,此方法获取的并不是源码文件,而是编译过的class文件。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容