这篇文章主要目的是用来介绍plugin,为了对本身非常枯燥的内容进行说明,这里特意跟前面的文章一样,准备了一个更加枯燥的例子(如何使用gradle的java plugin来打出一个jar文件),在枯燥的的gradle的学习的旅程中添加一丝不那么烦躁的情绪。
回答是什么的定义往往比较复杂,现在我们知道gradle是什么了,一个自动构建工具,但是它是如何支持java和groovy的编译构建呢?这是一个很好的问题,因为答案就是plugin。
不同的plugin提供了不同的功能,从这个角度上来说,gradle就是一个框架,而具体实现则是通过plugin来实现的,从某种意义上来说,maven的设计思路也是如出一辙。
我们不再谈论容易引起争执的设计思路是否一致的问题,至少下面的内容可以使得我们对于gradle的plugin的理解有一个开始:
gradle提供了一个用于构建的框架结构,具体的实际的构建通过不同的plugin来实现。
相较于是什么的问题,有什么就没有任何分歧了,在当前稳定的gradle的4.10.2版本,gradle官方提供的plugin主要有如下这些:
用途 | Plugin名称 | 功能说明 |
---|---|---|
JVM语言和框架 | Java | 提供java项目的构建支持 |
JVM语言和框架 | Java Library | 提供java库的构建支持 |
JVM语言和框架 | Groovy | 提供groovy项目的构建支持 |
JVM语言和框架 | Scala | 提供scala项目的构建支持 |
JVM语言和框架 | Play | 提供playframework应用的构建支持 |
JVM语言和框架 | ANTLR | 提供使用ANTLR生成词法分析器的支持 |
打包与发布 | Application | 提供构建基于JVM的可运行的应用程序的支持 |
打包与发布 | WAR | 提供WAR文件结构的打包支持 |
打包与发布 | EAR | 提供EAR结构的J2EE应用的打包支持 |
打包与发布 | OSGi | 提供创建OSGi包的支持 |
打包与发布 | Maven Publish | 提供Maven兼容的仓库的发布支持 |
打包与发布 | Ivy Publish | 提供Ivy兼容的仓库的发布支持 |
打包与发布 | Legacy Maven Plugin | 对使用了legacy机制的制品发布到Maven兼容的仓库的支持 |
打包与发布 | Distribution | 提供ZIP或者tar文件发布方式的支持 |
打包与发布 | Java Library Distribution | 提供创建包含运行依赖的java库的zip文件的支持 |
代码分析 | Checkstyle | 可集成使用checkstyle进行代码检查 |
代码分析 | FindBugs | 可集成使用FindBugs用于代码检查 |
代码分析 | PMD | 可集成使用PMD用于代码检查 |
代码分析 | JDepend | 可集成JDepend用于代码检查 |
代码分析 | JaCoCo | 可集成JaCoCo用于覆盖率数据提供 |
代码分析 | CodeNarc | 可集成CodeNarc用于groovy代码检查 |
IDE集成 | Eclipse | 用于创建可以被Eclipse的IDE打开的项目等 |
IDE集成 | IntelliJ IDEA | 用于创建可以被IntelliJ IDEA的IDE打开的项目 |
Utility | Base | 提供生命周期的常用task,比如clean等 |
Utility | Build init | 用于在新项目创建gradle骨架结构或者从maven等进行迁移是提供guide |
Utility | Signing | 提供对于生成的文件和制品的数字化签名的支持 |
Utility | Plugin Development | 提供更方便的方式用于开发Gradle Plugin |
这篇文章将通过使用java plugin来对一个简单的java应用进行jar的打包,来说明在gradle中plugin的使用方式。
做一个简单的HelloWorld的java类,然后将其打成一个jar文件,具体的文件结构如下所示
liumiaocn:plugin liumiao$ ls
build.gradle settings.gradle src
liumiaocn:plugin liumiao$ tree .
.
├── build.gradle
├── settings.gradle
└── src
└── main
├── java
│ └── com
│ └── liumiaocn
│ └── HelloPlugin.java
└── resources
└── com
└── liumiaocn
└── resource.xml
8 directories, 4 files
liumiaocn:plugin liumiao$
liumiaocn:plugin liumiao$ cat settings.gradle
rootProject.name = 'jarPluginSample'
liumiaocn:plugin liumiao$
liumiaocn:plugin liumiao$ cat build.gradle
apply plugin: 'java'
version = '1.0'
jar {
manifest {
attributes 'Implementation-Title': 'Gradle plugin sample: create jar distribution',
'Implementation-Version': version,
'Created-By': 'liumiaocn'
}
}
liumiaocn:plugin liumiao$
liumiaocn:plugin liumiao$ cat src/main/resources/com/liumiaocn/resource.xml
liumiaocn:plugin liumiao$
liumiaocn:plugin liumiao$ cat src/main/java/com/liumiaocn/HelloPlugin.java
package com.liumiaocn;
public class HelloPlugin {
private final String pluginName;
public HelloPlugin(String name) {
this.pluginName= name;
}
public void grettings() {
System.out.println("Hello, " + this.pluginName);
}
}
liumiaocn:plugin liumiao$
liumiaocn:plugin liumiao$ gradle projects
> Task :projects
------------------------------------------------------------
Root project
------------------------------------------------------------
Root project 'jarPluginSample'
No sub-projects
To see a list of the tasks of a project, run gradle :tasks
For example, try running gradle :tasks
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
liumiaocn:plugin liumiao$
使用普通方式的jar文件打包,过程繁琐的多,而这里,只需要gradle jar即可
liumiaocn:plugin liumiao$ ls
build.gradle settings.gradle src
liumiaocn:plugin liumiao$ gradle jar
BUILD SUCCESSFUL in 0s
3 actionable tasks: 3 executed
liumiaocn:plugin liumiao$
liumiaocn:plugin liumiao$ ls
build build.gradle settings.gradle src
liumiaocn:plugin liumiao$ tree build
build
├── classes
│ └── java
│ └── main
│ └── com
│ └── liumiaocn
│ └── HelloPlugin.class
├── libs
│ └── jarPluginSample-1.0.jar
├── resources
│ └── main
│ └── com
│ └── liumiaocn
│ └── resource.xml
└── tmp
├── compileJava
└── jar
└── MANIFEST.MF
13 directories, 4 files
liumiaocn:plugin liumiao$
liumiaocn:plugin liumiao$ zipinfo build/libs/jarPluginSample-1.0.jar
Archive: build/libs/jarPluginSample-1.0.jar
Zip file size: 1292 bytes, number of entries: 6
drwxr-xr-x 2.0 unx 0 b- defN 18-Nov-24 06:49 META-INF/
-rw-r--r-- 2.0 unx 146 b- defN 18-Nov-24 06:49 META-INF/MANIFEST.MF
drwxr-xr-x 2.0 unx 0 b- defN 18-Nov-24 06:49 com/
drwxr-xr-x 2.0 unx 0 b- defN 18-Nov-24 06:49 com/liumiaocn/
-rw-r--r-- 2.0 unx 758 b- defN 18-Nov-24 06:49 com/liumiaocn/HelloPlugin.class
-rw-rw-r-- 2.0 unx 39 b- defN 18-Nov-24 06:49 com/liumiaocn/resource.xml
6 files, 943 bytes uncompressed, 606 bytes compressed: 35.7%
liumiaocn:plugin liumiao$
注:jar就是一个压缩文件,没有zipinfo,你可以使用大部分解压软件均可看到内部内容
liumiaocn:plugin liumiao$ cat build/tmp/jar/MANIFEST.MF
Manifest-Version: 1.0
Implementation-Title: Gradle plugin sample: create jar distribution
Implementation-Version: 1.0
Created-By: liumiaocn
liumiaocn:plugin liumiao$
除了jar之外,比如gradle clean的task也被实现了,其实就是删除约定方式申城的构建目录build等。
liumiaocn:plugin liumiao$ ls
build build.gradle settings.gradle src
liumiaocn:plugin liumiao$ gradle clean
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
liumiaocn:plugin liumiao$ ls
build.gradle settings.gradle src
liumiaocn:plugin liumiao$
除此之外其他的task以及其关联关系,这篇文章不再说明,在后续进一步介绍之后再行展开。
liumiaocn:plugin liumiao$ gradle tasks
> Task :tasks
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'jarPluginSample'.
components - Displays the components produced by root project 'jarPluginSample'. [incubating]
dependencies - Displays all dependencies declared in root project 'jarPluginSample'.
dependencyInsight - Displays the insight into a specific dependency in root project 'jarPluginSample'.
dependentComponents - Displays the dependent components of components in root project 'jarPluginSample'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'jarPluginSample'. [incubating]
projects - Displays the sub-projects of root project 'jarPluginSample'.
properties - Displays the properties of root project 'jarPluginSample'.
tasks - Displays the tasks runnable from root project 'jarPluginSample'.
Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.
Rules
-----
Pattern: clean: Cleans the output files of a task.
Pattern: build: Assembles the artifacts of a configuration.
Pattern: upload: Assembles and uploads the artifacts belonging to a configuration.
To see all tasks and more detail, run gradle tasks --all
To see more detail about a task, run gradle help --task
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
liumiaocn:plugin liumiao$
plugin在gradle中是一个非常重要的概念,正是使用了这种方式,才使得gradle有了更好的灵活性,这篇文章通过一个简单的例子介绍了plugin的使用方式,使得我们对其有了一个大体上的认识,详细的说明,后面会进一步展开。
https://docs.gradle.org/current/userguide/plugin_reference.html
https://www.playframework.com/
https://www.antlr.org/
https://guides.gradle.org/migrating-from-maven/
https://docs.gradle.org/current/userguide/java_plugin.html