使用 Kotlin , Groovy ,Java 开发一个自己的 Gradle 插件

简介: 使用 Kotlin , Groovy ,Java 开发一个自己的 Gradle 插件先上效果图:image.png功能说明:korGenerate:自动生成 Entity,Dao,Controller 模板代码ko...

使用 Kotlin , Groovy ,Java 开发一个自己的 Gradle 插件

先上效果图:

image.png

功能说明:

korGenerate:

自动生成 Entity,Dao,Controller 模板代码

korFront:

自动 copy 前端 front 工程目录下面的 —— nowa 构建的 dist 目录下的静态资源文件:html, css, js


image.png
image.png
image.png
image.png
image.png

build.gradle

group 'com.easykotlin.plugin'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.2.0'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'groovy'
apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'maven'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compile 'org.codehaus.groovy:groovy-all:2.3.11'
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile gradleApi()
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
image.png

其中,compile gradleApi() 是使用 Gradle 的 API 依赖。

配置上传到 maven 仓库,这里我们配置上传至本机的目录下:

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri('/Users/jack/.m2/repository'))
        }
    }
}

点击右侧工具栏的: upload > uploadArchives

image.png

执行日志:

23:41:48: Executing external task 'uploadArchives'...
:compileKotlin UP-TO-DATE
:compileJava NO-SOURCE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:uploadArchives

BUILD SUCCESSFUL in 0s
4 actionable tasks: 1 executed, 3 up-to-date
23:41:49: External task execution finished 'uploadArchives'.

看一下本机的上传情况:

~/.m2/repository/com/easykotlin/plugin/kor$ tree 
.
├── 1.0-SNAPSHOT
│   ├── kor-1.0-20171221.172201-1.jar
│   ├── kor-1.0-20171221.172201-1.jar.md5
│   ├── kor-1.0-20171221.172201-1.jar.sha1
│   ├── kor-1.0-20171221.172201-1.pom
│   ├── kor-1.0-20171221.172201-1.pom.md5
│   ├── kor-1.0-20171221.172201-1.pom.sha1
│   ├── kor-1.0-20171221.172210-2.jar
│   ├── kor-1.0-20171221.172210-2.jar.md5
│   ├── kor-1.0-20171221.172210-2.jar.sha1
│   ├── kor-1.0-20171221.172210-2.pom
│   ├── kor-1.0-20171221.172210-2.pom.md5
│   ├── kor-1.0-20171221.172210-2.pom.sha1
│   ├── maven-metadata-remote.xml
│   ├── maven-metadata-remote.xml.sha1
│   ├── maven-metadata.xml
│   ├── maven-metadata.xml.md5
│   ├── maven-metadata.xml.sha1
│   └── resolver-status.properties
├── maven-metadata-remote.xml
├── maven-metadata-remote.xml.sha1
├── maven-metadata.xml
├── maven-metadata.xml.md5
├── maven-metadata.xml.sha1
└── resolver-status.properties

1 directory, 24 files

其中,kor-1.0-20171221.154128-1.pom 文件的内容是:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.easykotlin.plugin</groupId>
  <artifactId>kor</artifactId>
  <version>1.0-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <groupId>org.jetbrains.kotlin</groupId>
      <artifactId>kotlin-stdlib-jdk8</artifactId>
      <version>1.2.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

新建Gradle 插件的执行逻辑的实现类

image.png
image.png
image.png

实现代码编写:

image.png
image.png
package com.easykotlin.kor

import org.gradle.api.Plugin
import org.gradle.api.Project

class KorPlugin implements Plugin<Project>{


    @Override
    void apply(Project project) {

    }
}

具体实现代码:

package com.easykotlin.kor

import org.gradle.api.Plugin
import org.gradle.api.Project

class KorPlugin implements Plugin<Project> {


    @Override
    void apply(Project project) {

        project.task("kor") << {
            println("Hello, Kor !")
            println(project.group.toString())
            println(project.artifacts.toString())
        }

        project.task("nowabuild") << {
            NowaBuildJava nb = new NowaBuildJava()
            String projectDir = project.projectDir.absolutePath
            println("projectDir = $projectDir")
            nb.nowaBuild(projectDir)
        }
    }
}

kor.properties

implementation-class=com.easykotlin.kor.KorPlugin
image.png

build.gradle

group 'com.easykotlin.plugin'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.2.0'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'groovy'
apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'maven'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
//    compile 'org.codehaus.groovy:groovy-all:2.4.11'
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile gradleApi()
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}


uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri('/Users/jack/.m2/repository'))
        }
    }
}

image.png

然后,我们在另外项目 reakt 中使用刚才开发的插件:

build.gradle

buildscript {
    ext {
        kotlinVersion = '1.2.0'
        springBootVersion = '2.0.0.M7'
    }
    repositories {
        mavenLocal()
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
        classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
        classpath('com.easykotlin.plugin:kor:1.0-SNAPSHOT')
    }
}

apply plugin: 'com.easykotlin.kor'

......

image.png
image.png

Gradle 插件工程源代码:

https://github.com/EasySpringBoot/kor

使用插件的工程源代码:

https://github.com/EasyKotlin/reakt

相关文章
|
16天前
|
Java
轻松上手Java字节码编辑:IDEA插件VisualClassBytes全方位解析
本插件VisualClassBytes可修改class字节码,包括class信息、字段信息、内部类,常量池和方法等。
66 6
|
4天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
13 2
|
23天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
23天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
23天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
1月前
|
安全 Java Android开发
Kotlin为什么没有Java流行
Kotlin流行不起来的原因
104 1
|
9天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(1)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(1)
18 0
|
2月前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
本系列教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文档重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android library开发建议以及在Kotlin和Java之间互相调用的方法。
24 1
|
16天前
|
Java 数据库连接 编译器
Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin 兼容 Java 遇到的最大的“坑”
11 0
|
2月前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
26 1
下一篇
无影云桌面