Gradle这篇文章就够用了07使用plugin进行jar文件打包

编程

gradle的plugin是什么

回答是什么的定义往往比较复杂,现在我们知道gradle是什么了,一个自动构建工具,但是它是如何支持java和groovy的编译构建呢?这是一个很好的问题,因为答案就是plugin。

不同的plugin提供了不同的功能,从这个角度上来说,gradle就是一个框架,而具体实现则是通过plugin来实现的,从某种意义上来说,maven的设计思路也是如出一辙。

我们不再谈论容易引起争执的设计思路是否一致的问题,至少下面的内容可以使得我们对于gradle的plugin的理解有一个开始:

gradle提供了一个用于构建的框架结构,具体的实际的构建通过不同的plugin来实现。

gradle有哪些plugin

相较于是什么的问题,有什么就没有任何分歧了,在当前稳定的gradle的6.2.1版本,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文件,具体的文件结构如下所示:

orrincn:plugin orrin$ ls

build.gradle settings.gradle src

orrincn:plugin orrin$ tree .

.

├── build.gradle

├── settings.gradle

└── src

└── main

├── java

│ └── com

│ └── orrincn

│ └── HelloPlugin.java

└── resources

└── com

└── orrincn

└── resource.xml

8 directories, 4 files

orrincn:plugin orrin$

settings.gradle

orrincn:plugin orrin$ cat settings.gradle 

rootProject.name = "jarPluginSample"

orrincn:plugin orrin$

rootProject.name在创建jar文件时根据约定会被使用。

build.gradle

orrincn:plugin orrin$ 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": "orrincn"

}

}

orrincn:plugin orrin$

  • apply plugin: ‘java’:是引入java plugin支持唯一需要做的事情
  • version:在生成的jar文件中会按照约定生成在jar文件名中
  • jar{}: jar是java - plugin所实现的task之一,这里使用它直接用来生成jar文件
  • manifest{}:用于设定MANIFEST.MF的内容

resource文件

orrincn:plugin orrin$ cat src/main/resources/com/orrincn/resource.xml 

<?xml version="1.0" encoding="UTF-8"?>

orrincn:plugin orrin$

仅仅是一个示例,用于演示在jar文件中资源文件也被打包的过程

HelloPlugin类

orrincn:plugin orrin$ cat src/main/java/com/orrincn/HelloPlugin.java 

package com.orrincn;

public class HelloPlugin {

private final String pluginName;

public HelloPlugin(String name) {

this.pluginName= name;

}

public void grettings() {

System.out.println("Hello, " + this.pluginName);

}

}

orrincn:plugin orrin$

确认project信息

orrincn:plugin orrin$ gradle projects

> Task :projects

------------------------------------------------------------

Root project

------------------------------------------------------------

Root project "jarPluginSample"

No sub-projects

To see a list of the tasks of a project, run gradle <project-path>:tasks

For example, try running gradle :tasks

BUILD SUCCESSFUL in 0s

1 actionable task: 1 executed

orrincn:plugin orrin$

打包过程

使用普通方式的jar文件打包,过程繁琐的多,而这里,只需要gradle jar即可

orrincn:plugin orrin$ ls

build.gradle settings.gradle src

orrincn:plugin orrin$ gradle jar

BUILD SUCCESSFUL in 0s

3 actionable tasks: 3 executed

orrincn:plugin orrin$

  • 结果确认

    可以看到jar文件已经生成在lib下了

orrincn:plugin orrin$ ls

build build.gradle settings.gradle src

orrincn:plugin orrin$ tree build

build

├── classes

│ └── java

│ └── main

│ └── com

│ └── orrincn

│ └── HelloPlugin.class

├── libs

│ └── jarPluginSample-1.0.jar

├── resources

│ └── main

│ └── com

│ └── orrincn

│ └── resource.xml

└── tmp

├── compileJava

└── jar

└── MANIFEST.MF

13 directories, 4 files

orrincn:plugin orrin$

  • 确认jar文件内容

orrincn:plugin orrin$ zipinfo build/libs/jarPluginSample-1.0.jar 

Archive: build/libs/jarPluginSample-1.0.jar

Zip file size: 1275 bytes, number of entries: 6

drwxr-xr-x 2.0 unx 0 b- defN 20-Apr-05 12:51 META-INF/

-rw-r--r-- 2.0 unx 144 b- defN 20-Apr-05 12:51 META-INF/MANIFEST.MF

drwxr-xr-x 2.0 unx 0 b- defN 20-Apr-05 12:51 com/

drwxr-xr-x 2.0 unx 0 b- defN 20-Apr-05 12:51 com/orrincn/

-rw-r--r-- 2.0 unx 754 b- defN 20-Apr-05 12:51 com/orrincn/HelloPlugin.class

-rw-r--r-- 2.0 unx 39 b- defN 20-Apr-05 12:51 com/orrincn/resource.xml

6 files, 937 bytes uncompressed, 601 bytes compressed: 35.9%

orrincn:plugin orrin$

注:jar就是一个压缩文件,没有zipinfo,你可以使用大部分解压软件均可看到内部内容

  • 确认MANIFEST.MF

orrincn:plugin orrin$ cat build/tmp/jar/MANIFEST.MF 

Manifest-Version: 1.0

Implementation-Title: Gradle plugin sample: create jar distribution

Implementation-Version: 1.0

Created-By: orrincn

orrincn:plugin orrin$

其他task

除了jar之外,比如gradle clean的task也被实现了,其实就是删除约定方式生成的构建目录build等。

orrincn:plugin orrin$ ls

build build.gradle settings.gradle src

orrincn:plugin orrin$ gradle clean

BUILD SUCCESSFUL in 0s

1 actionable task: 1 executed

orrincn:plugin orrin$ ls

build.gradle settings.gradle src

orrincn:plugin orrin$

除此之外其他的task以及其关联关系,这篇文章不再说明,在后续进一步介绍之后再行展开。

orrincn:plugin orrin$ 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<TaskName>: Cleans the output files of a task.

Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.

Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.

总结

plugin在gradle中是一个非常重要的概念,正是使用了这种方式,才使得gradle有了更好的灵活性,这篇文章通过一个简单的例子介绍了plugin的使用方式,使得我们对其有了一个大体上的认识,详细的说明,后面会进一步展开。

以上是 Gradle这篇文章就够用了07使用plugin进行jar文件打包 的全部内容, 来源链接: utcz.com/z/515153.html

回到顶部