`

定制一个Gradle Plugin --- project-structure

 
阅读更多
最近在项目中遇到一个不大,但是还蛮烦人的问题,在Maven的约定中,一个标准Java项目的代码结构如下:
project
--src
    --main
        --java
        --resources
    --test
        --java
        --resources
   
当‘gradle idea’构建intelliJ项目文件时,会自动帮忙设置好所有的Source Root,Test Source Root。但是,在我工作的部门中,我们希望可以把测试分为unit,intg2个类别,这样可以更加容易区分测试的目的,同时提供了Build Pipeline分别运行不同类别测试的能力。因此,我们部门内的标准Java项目结构如下:
project
--src
    --main
        --java
        --resources
    --test
        --common
    	    --java
        --unit
    	    --java
    	    --resources
        --intg
    	    --java
    	    --resources

有了这个目录结构之后我们剩下2个问题要解决:
1. 如何区分运行IntegrationTest和Unit Test
2. 如何保证‘gradle idea’以后,无需重新设置Test Source Root。因为gradle不具备识别新的代码结构的能力。

如何写一个Gradle Plugin

语言:
Java,Groovy,Scala都可,推荐用Groovy,毕竟Gradle本质上来说就是一个用Groovy写的DSL,使用Groovy可以更一致一点。

注入方式:
Gradle支持3种形式的定制Plugin注入:
  • 1. 直接把Plugin源代码直接写在Build Script里面。
  • 2. 把Pluigin源代码写到rootProjectDir/buildSrc/src/main/groovy目录下
  • 3. 用一个单独的project来写Plugin源代码,然后以jar依赖的形式注入项目。

个人觉得,都想到要自己写一个Plugin了,那么一定是有多个项目公用这个Plugin了,否则的话,直接把Plugin的代码直接写到脚本里就好了。因此,要定制Plugin,在我看来,一定是需要以一个单独的jar形式注入的。

写project-structure Plugin:
在Gradle中,写一个Plugin非常简单,首先,添加项目依赖,我使用Groovy来写插件,所以添加了localGroovy依赖。
apply plugin: 'groovy'

dependencies {
    compile gradleApi()
    compile localGroovy()
}

然后写Plugin的实现代码,实现代码只需要实现Plugin<Project>接口即可,在我的实现代码中,做了两件事,一是定制了项目的代码结构,二是添加了integrationTest Task,该Task只运行*IntegrationTest.class, 这样可以在Build Pipeline分阶段运行Unit Test和IntegrationTest。
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.testing.Test

class ProjectStructurePlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        project.logger.info "Configuring Project Structure for $project.name"

        project.configurations {
            integrationTestCompile { extendsFrom testCompile }
            integrationTestRuntime { extendsFrom integrationTestCompile, testRuntime }
        }
        configureSourceSets(project)
        addIntegrationTestTask(project)
    }

    private void addIntegrationTestTask(Project project) {
        Test intgTest = project.getTasks().create("integrationTest", Test.class);
        intgTest.testClassesDir = project.sourceSets.integrationTest.output.classesDir
        intgTest.includes = ["**/*IntegrationTest.class"]
        intgTest.inputs.dir 'src'
        intgTest.outputs.dir project.sourceSets.integrationTest.output.classesDir
        project.check.dependsOn project.integrationTest
        intgTest.dependsOn project.test
    }

    private void configureSourceSets(Project project) {
        project.sourceSets {
            test {
                java {
                    srcDir 'src/test/unit/java'
                    srcDir 'src/test/common/java'
                }
                resources {
                    srcDir 'src/test/unit/resources'
                }
            }

            integrationTest {
                java {
                    srcDir 'src/test/intg/java'
                    srcDir 'src/test/common/java'
                }
                resources {
                    srcDir 'src/test/intg/resources'
                }
                compileClasspath = project.sourceSets.main.output + project.sourceSets.test.output + project.configurations.integrationTestCompile
                runtimeClasspath = output + compileClasspath + project.configurations.integrationTestRuntime
            }
        }
    }
}

接着,在项目的src/main/resources/META-INF/gradle-plugins目录下,创建一个文件:<plugin-name>.properties,在该文件中指定Plugin的实现类:
implementation-class=com.xianlinbox.plugins.ProjectStructurePlugin


在项目中使用该Plugin
首先,需要在build.gradle脚本中引入该Plugin的jar包依赖,可以是以文件的形式,当然个人更推荐的是把jar包发布到Maven库中,以Maven依赖的形式的注入,本例中使用的是本地文件依赖:
buildscript {
    dependencies {
        classpath fileTree(dir: 'libs', include: '*.jar')
    }
}
然后,注入编写的插件,注意,该插件必须和java plugin一起使用,因为其中使用到SourceSets属性是从该插件中引入进来的:
apply plugin: 'java'
apply plugin: 'project-structure'

有了这个插件之后,就可以通过‘gradle test’和‘gradle integrationtTest’区别运行UnitTest和IntrgrationTest了。

最后,解决自动设置Test Source Root的问题,只需要在build.gradle为ideaModule Task增加识别Test Source Root的能力即可:
apply plugin: 'idea'
...
idea {
    module {
        testSourceDirs += file('src/test/intg/java')
        testSourceDirs += file('src/test/intg/resources')
    }
}

当然,我们也可以把它写到Plugin中去,在设置为Project-Structrue之后:
......
 compileClasspath = project.sourceSets.main.output + project.sourceSets.test.output + project.configurations.integrationTestCompile
                runtimeClasspath = output + compileClasspath + project.configurations.integrationTestRuntime
project.idea {
            module {
                testSourceDirs = testSourceDirs + new File('src/test/intg/java') + new File('src/test/intg/resources')
            }
        }










2
0
分享到:
评论

相关推荐

    Android studio 配置gradle 2.3.0 插件所需pom、jar文件

    Gradle是一个强大的自动化构建工具,Android Studio默认使用Gradle作为构建系统,允许开发者灵活地配置项目的构建过程。在本文中,我们将详细探讨如何在Android Studio中配置Gradle 2.3.0插件,以及如何处理pom和jar...

    lombok-plugin-0.30-2020.1.zip

    在软件开发过程中,Java开发者经常面临一个问题,那就是为类的属性编写getter和setter方法,这既耗时又增加了代码冗余。为了解决这一问题,Lombok项目应运而生。Lombok是一款强大的代码生成库,它允许我们在编译时...

    IDEA插件-lombok-plugin-0.14.14

    `lombok-plugin-0.14.14`是该插件的一个版本,它为IDEA提供了对Lombok注解的编译时和运行时支持。 ### 安装Lombok插件 在IntelliJ IDEA中,可以通过以下步骤安装`lombok-plugin`: 1. 打开IDEA设置(Preferences ...

    butterkknife10-jar.zip

    3. **配置构建路径**:在Android Studio中,打开项目结构设置(File &gt; Project Structure),选择“Modules”,然后在“Dependencies”标签页中点击“+”号,选择“JARs or directories”,浏览并添加刚刚放入`libs`...

    lombok-plugin-2021.3.zip

    Lombok 是一个非常受欢迎的 Java 开发工具,它通过注解的方式简化了 Java 代码,尤其是数据类的编写。在给定的压缩包文件 "lombok-plugin-2021.3.zip" 中,我们找到了适用于 IntelliJ IDEA 2021.3 版本的 Lombok ...

    lombok-intellij-plugin-releasebuild_0.29-2020.1-2.zip

    然后,在IDEA的设置中开启Lombok插件,并确保IDE的Project Structure中包含了Lombok处理的JDK或者JAR。这样,IDE就会在编译时调用Lombok工具来生成相应的方法。 在实际开发中,Lombok的使用可以带来诸多益处。例如...

    intellij-plugin-toolwindow-template:带有示例工具窗口的IntelliJ插件模板项目。 由Gradle支持

    通过这个模板,开发者可以快速地创建一个包含工具窗口的插件,并根据需求进行定制。例如,可以添加新的Action来触发工具窗口的显示,或者在工具窗口中展示自定义的数据或视图。同时,由于项目使用Gradle,开发者可以...

    如何升级gradle

    - 在`File -&gt; Project Structure -&gt; Project`界面中,分别修改`Gradle Version`和`Android Plugin Version`至最新的推荐版本。 - 特别注意,对于`Build Tools Version`,即使不完全匹配也不会导致项目无法构建,但...

    android studio更新gradle错误构建项目失败的解决方法

    1. 在Project Structure中,直接升级版本。 无法更新SDK或build tools 在Android Studio中,可能会遇到无法更新SDK或build tools的问题。解决方法是: 1. 关闭代理模式,或者手动下载SDK或build tools。 总结 ...

    lombok-plugin

    8. 最后,如果你的项目使用了注解处理器,记得在IDEA的模块设置中开启注解处理(Project Structure &gt; Modules &gt; Dependencies &gt; Annotation Processors)。 通过以上步骤,我们就可以在IntelliJ IDEA中愉快地使用...

    idea 2018.1.1离线安装 lombok插件,带有jar包及插件

    在本例中,你已经有了名为“lombok-plugin”的压缩包文件,这通常包含了一个或多个`.jar`文件和插件配置文件。 2. **安装Lombok库**: Lombok的`.jar`文件是用于编译时插入源码的,将其添加到你的项目依赖中。如果...

    2021.2.3idea安装lombok插件方法.zip

    在本压缩包中,已经提供了一个名为`lombok-plugin-0.34-2020.2.zip`的文件,这就是我们需要的Lombok插件。你可以直接使用,无需单独去官网下载。 2. **启动IDEA**:打开你的IDEA 2021.2.3版本,进入主界面。 3. **...

    Android Studio 3.0 gradle提示版本太老

    - 新建一个系统环境变量,变量名为`ANDROID_DAILY_OVERRIDE`,变量值为提供的特定字符串(在示例中为`d27b293f4c7c48dfe922ba160164f3fa511cb3b9`)。 - 这种方法仅作为临时解决方案,因为这只是绕过了版本检查,...

    lombok idea 插件最新版(解决报红错问题).zip

    "lombok-plugin-0.23.jar"是针对这个问题的一个解决方案,它是Lombok IDEA插件的最新版本,旨在修复与IDEA 2018.3及其他后续版本的兼容性问题。安装这个插件后,应该可以消除因Lombok导致的编译错误和警告,使代码...

    新建文件夹lombok.7z

    在Maven或Gradle中,通常需要添加相应的编译插件,例如Maven的maven-compiler-plugin,或者在IDEA的Project Structure中设置注解处理器路径。 总之,Lombok插件是IDEA开发环境中的一大利器,它能帮助开发者减少冗余...

    IntelliJ Platform Plugin SDK汉化文档

    1. 运行配置:创建一个新的“Application”运行配置,选择插件模块并指定IDE实例参数。 2. 调试插件:使用“Debug”模式启动IDE,以便在实际环境中测试插件功能。 六、插件打包与发布 1. 构建插件:使用Maven或...

    Java打Jar包方法和实例

    Java打Jar包是Java开发过程中常见的一项操作,它将多个类文件、资源文件等打包成一个可执行的JAR(Java Archive)文件,方便分发、部署和运行。本篇文章将详细阐述Java打Jar包的方法,并通过实例进行演示。 1. **...

    Android_NDK环境搭建

    Android NDK环境搭建是Android应用开发中的一个重要环节,它允许开发者使用C++或者其他的本地语言进行性能敏感部分的编程,从而提升应用的运行效率。本文将详细阐述如何配置和使用Android NDK。 首先,理解NDK是...

    image_classification.zip

    一个可运行的(我自己调试运行过了,绝对没问题,把Project Structure配置成自家AS的Gradle版本、Gradle Plugin版本即可)官方TensorFlowLite安卓端案例项目; 可以进行相机图片的实时识别和分类,并丝滑显示在UI中...

    Android Studio中引入Lambda表达式的方法

    打开项目(Project)的build.gradle,在dependencies节点添加 classpath 'me.tatarka:gradle-retrolambda:3.2.0'   打开项目(Module)的build.gradle,在根节点添加 apply plugin: 'me.tatarka.retrolam

Global site tag (gtag.js) - Google Analytics