Gradle 实战 - 插件-ApiHug准备-工具篇-015

news2024/11/15 11:20:38

  🤗 ApiHug × {Postman|Swagger|Api...} = 快↑ 准√ 省↓

  1. GitHub - apihug/apihug.com: All abou the Apihug   
  2. apihug.com: 有爱,有温度,有质量,有信任
  3. ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace

ApiHug 整个工具链基于 Gradle, 使用 ApiHug 准备工作最先需要学习的就是 gradle. 工欲善其事,必先利其器

如何去扩展 gradle 自带的功能, gradle 是高度定制化, 我们日常很多功能也是社区插件提供的。 Developing Custom Gradle Pluginsopen in new window

#插件位置

#Build Script

位于 buildSrc 下的插件功能, 只能对本项目可见, 不能跨项目分享。

Gradle 会自动检查 来自buildSrc/src/main/java 的扩展, 如果有扩展, gradle 自动包含里面的插件。

#独立插件

完全独立的项目, 就像独立的第三方 Lib 一样, 可以在不同项目中共享重用。

#Build Script - 实现

两个比较完备的例子: Spring framework 内置插件open in new window & Spring boot 内置插件open in new window

定义插件:

  1. 继承 org.gradle.api.Plugin
  2. 扩展 org.gradle.api.Project

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

public class GreetingPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        project.task("hello")
                .doLast(task -> System.out.println("Hello Gradle!"));
    }
}

buildSrc/build.gradle 内容:


plugins {
    id 'java-gradle-plugin'
}

gradlePlugin {
    plugins {

        compileConventionsPlugin {
            id = "com.dearxue.GreetingPlugin"
            implementationClass = "com.dearxue.GreetingPlugin"
        }
    }
}

在 app 项目中引入:


plugins {
    // Apply the application plugin to add support for building a CLI application in Java.
    id 'application'
    id 'com.dearxue.GreetingPlugin'
}

运行命令:

>gradlew.bat clean build -x test

BUILD SUCCESSFUL in 3s
12 actionable tasks: 10 executed, 2 up-to-date
.......gradle-advanced>gradlew.bat app:hello

> Task :app:hello
Hello Gradle!

#插件配置

扩展配置 GreetingPluginExtension

public class GreetingPluginExtension {
    private String greeter = "Baeldung";
    private String message = "Message from the plugin!"
    // standard getters and setters
}

改进后的类 GreetingPlugin


public class GreetingPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {

        GreetingPluginExtension extension = project.getExtensions()
                .create("greeting", GreetingPluginExtension.class);


        project.task("hello")
                .doLast(task -> {
                    System.out.println(
                            "Hello, " + extension.getGreeter());
                    System.out.println(
                            "I have a message for You: " + extension.getMessage());
                });
    }
}

修改后的 app/build.gradle:

greeting {
    greeter = "Stranger"
    message = "Message from the build script"
}

运行效果:

>gradlew.bat app:hello

> Task :app:hello
Hello, Stranger
I have a message for You: Message from the build script

#独立插件 - 实现

最好的参照:

  1. Spring depedency 插件open in new window
  2. Spring boot 插件open in new window

例子参考例子项目中的 plugin 子项目, 包含相关的单元测试:

plugins {
    // Apply the Java Gradle plugin development plugin to add support for developing Gradle plugins
    id 'java-gradle-plugin'
}

gradlePlugin {
    // Define the plugin
    plugins {
        greeting {
            id = 'com.dearxue.greeting'
            implementationClass = 'com.dearxue.PppPlugin'
        }
    }
}

configurations.functionalTestImplementation.extendsFrom(configurations.testImplementation)

// Add a task to run the functional tests
tasks.register('functionalTest', Test) {
    testClassesDirs = sourceSets.functionalTest.output.classesDirs
    classpath = sourceSets.functionalTest.runtimeClasspath
    useJUnitPlatform()
}

gradlePlugin.testSourceSets(sourceSets.functionalTest)

tasks.named('check') {
    // Run the functional tests as part of `check`
    dependsOn(tasks.functionalTest)
}

tasks.named('test') {
    // Use JUnit Jupiter for unit tests.
    useJUnitPlatform()
}

#单元测试

class PppPluginTest {
  @Test
  void pluginRegistersATask() {
    // Create a test project and apply the plugin
    Project project = ProjectBuilder.builder().build();
    project.getPlugins().apply("com.dearxue.greeting");

    // Verify the result
    assertNotNull(project.getTasks().findByName("greeting"));
  }
}

#功能测试

@Test
  void canRunTask() throws IOException {
    writeString(getSettingsFile(), "");
    writeString(getBuildFile(), "plugins {" + "  id('com.dearxue.greeting')" + "}");

    // Run the build
    GradleRunner runner = GradleRunner.create();
    runner.forwardOutput();
    runner.withPluginClasspath();
    runner.withArguments("greeting");
    runner.withProjectDir(projectDir);
    BuildResult result = runner.build();

    // Verify the result
    assertTrue(result.getOutput().contains("Hello from plugin 'com.dearxue.greeting'"));
  }

#发布

ID 命名规范:

  1. They can contain only alphanumeric characters, “.” and “-“
  2. The id has to have at least one “.” separating the domain name from the plugin name
  3. Namespaces org.gradle and com.gradleware are restricted
  4. An id cannot start or end with “.”
  5. No two or more consecutive “.” characters are allowed

参考下 spring depedency management:


gradlePlugin {
	plugins {
		dependencyManagement {
			displayName = 'Dependency management plugin'
			description = 'A Gradle plugin that provides Maven-like dependency management functionality'
			id = 'io.spring.dependency-management'
			implementationClass = 'io.spring.gradle.dependencymanagement.DependencyManagementPlugin'
		}
	}
}

#总结

项目地址 gradle-advanced plugin 教程

我们

api-hug-contact

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1595711.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 人形骨骼动画模型嘴巴张开

最近搞Daz3D玩&#xff0c;导入后挂上动画模型嘴巴张开&#xff0c;其丑无比。 Google了一下&#xff0c;得知原因是Unity没有对下巴那根骨骼做控制&#xff0c;动画系统就会把它放到默认的位置&#xff0c;嘴巴就张开了。找到了3种解决办法。 1.移除动画中对下巴这个骨骼的转…

【深度学习】YOLO-World: Real-Time Open-Vocabulary Object Detection,目标检测

介绍一个酷炫的目标检测方式&#xff1a; 论文&#xff1a;https://arxiv.org/abs/2401.17270 代码&#xff1a;https://github.com/AILab-CVC/YOLO-World 文章目录 摘要Introduction第2章 相关工作2.1 传统目标检测2.2 开放词汇目标检测 第3章 方法3.1 预训练公式&#xff1a…

C语言中的数据结构--链表的应用2(3)

前言 上一节我们学习了链表的应用&#xff0c;那么这一节我们继续加深一下对链表的理解&#xff0c;我们继续通过Leetcode的经典题目来了解一下链表在实际应用中的功能&#xff0c;废话不多说&#xff0c;我们正式进入今天的学习 单链表相关经典算法OJ题4&#xff1a;合并两个…

【前端工程化指南】什么是版本控制系统?

什么是版本控制系统 想必大家在多人开发时一定会遇到这样的问题&#xff1a; 每次集中合并大家的代码都要通过U盘、网盘等各类传输工具集中代码&#xff0c;非常麻烦。在多人同时修改同一文件或相同部分代码时&#xff0c;可能会产生冲突&#xff0c;开发人员需要手动比较代码…

自编译支持CUDA硬解的OPENCV和FFMPEG

1 整体思路 查阅opencv的官方文档&#xff0c;可看到有个cudacodec扩展&#xff0c;用他可方便的进行编解码。唯一麻烦的是需要自行编译opencv。 同时&#xff0c;为了考虑后续方便&#xff0c;顺手编译了FFMPEG&#xff0c;并将其与OPENCV绑定。 在之前的博文“鲲鹏主机昇腾A…

《系统分析与设计》实验-----需求规格说明书 哈尔滨理工大学

文章目录 需求规格说明书1&#xff0e;引言1.1编写目的1.2项目背景1.3定义1.4参考资料 2&#xff0e;任务概述2.1目标2.2运行环境2.3条件与限制 3&#xff0e;数据描述3.1静态数据3.2动态数据3.3数据库介绍3.4数据词典3.5数据采集 4&#xff0e;功能需求4.1功能划分4.2功能描述…

arxiv文章导出的bibtex格式是misc导致latex引用不正确

问题 在arxiv官网上右下角导出bibtex&#xff0c;发现是misc格式&#xff0c;然后我用的是springer的期刊latex模板&#xff0c;发现引用不正确。 引用效果如下&#xff0c;就只有一个2024。 解决方案&#xff1a; 把上面那个bibtex手动改成下面这个。 article{liu2024in…

SpringCloud实用篇(四)——Nacos

Nacos nacos官方网站&#xff1a;https://nacos.io/ nacos是阿里巴巴的产品&#xff0c;现在是springcloud的一个组件&#xff0c;相比于eureka的功能更加丰富&#xff0c;在国内备受欢迎 nacos的安装 下载地址&#xff1a;https://github.com/alibaba/nacos/releases/ 启动…

【寒假集训营总结笔记——7道优质好题】

牛客寒假集训营总结笔记——7道优质好题 一、Trie树的应用&#xff1a; 题目链接&#xff1a;Tokitsukaze and Min-Max XOR 1、题意 2、题解 1、首先这道题的答案和元素本身的顺序是无关的&#xff0c;因为假如你选择了一些数字&#xff0c;它是默认必须排好序才能记作是答案…

docker特殊问题处理3——docker-compose安装配置nacos

最近几年随着大数据和人工智能持续大热&#xff0c;容器化安装部署运维已经走进了各个中小公司&#xff0c;也得已让众多开发者能上手实际操作&#xff0c;不过说真心话&#xff0c;“万物皆可容器化”的理念越来越深入人心。 而如何使用docker-compose安装&#xff0c;配置&a…

mxnet安装

ChatGPT 安装 MXNet 是一个非常直接的过程&#xff0c;可以通过几种方法实现&#xff0c;包括使用Python的包管理工具pip安装预编译的二进制包&#xff0c;或者从源代码编译。以下是使用pip安装MXNet的基本步骤&#xff1a;1. 首先&#xff0c;确保已经安装了Python和pip。通常…

ELK(Elasticsearch+Logstash+Kibana)日志分析系统

目录 前言 一、ELK日志分析系统概述 1、三大组件工具介绍 1.1 Elasticsearch 1.1.1 Elasticsearch概念 1.1.2 关系型数据库和ElasticSearch中的对应关系 1.1.3 Elasticsearch提供的操作命令 1.2 Logstash 1.2.1 Logstash概念 1.2.2 Logstash的主要组件 1.2.3 Logsta…

Weblogic任意文件上传漏洞(CVE-2018-2894)漏洞复现(基于vulhub)

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

【面试八股总结】排序算法(一)

参考资料 &#xff1a;阿秀 一、冒泡排序 冒泡排序就是把小的元素往前交换或者把大的元素往后交换&#xff0c;比较相邻的两个元素&#xff0c;交换也发生在这两个元素之间。具体步骤&#xff1a; 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。对每一对…

RabbitMQ实战教程(1)

RabbitMQ 一、RabbitMQ介绍 1.1 现存问题 服务调用&#xff1a;两个服务调用时&#xff0c;我们可以通过传统的HTTP方式&#xff0c;让服务A直接去调用服务B的接口&#xff0c;但是这种方式是同步的方式&#xff0c;虽然可以采用SpringBoot提供的Async注解实现异步调用&…

CSS导读 (元素显示模式 上)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 三、CSS的元素显示模式 3.1 什么是元素显示模式 3.2 块元素 3.3 行内元素 3.4 行内块元素 3.5 元素…

Spring Boot中整合JodConverter实现文件在线预览

Spring Boot中整合JodConverter实现文件在线预览 1.安装LibreOffice 24.2 下载地址 LibreOffice 是一款功能强大的办公软件&#xff0c;默认使用开放文档格式 (OpenDocument Format , ODF), 并支持 *.docx, *.xlsx, *.pptx 等其他格式。 它包含了 Writer, Calc, Impress, Dra…

【学习资源】自适应学习的理论、典型产品和参考代码

图片来源&#xff1a;https://www.evelynlearning.com/adaptive-learning-in-the-classroom/ 自适应学习的类别 自适应学习目前分三个层次&#xff0c;包括学习活动层次、题目层次和知识点层次的自适应。以下分别从理论、典型产品和参考代码介绍三个层次。 学习活动层次的自适…

季节更迭 关爱不变 | 鲁南制药四季守护您的健康生活

春天&#xff0c;万物复苏的季节&#xff0c;一切都充满了生机和活力。在春日的阳光下&#xff0c;鲜花盛开&#xff0c;绿叶茂盛&#xff0c;鸟儿欢歌&#xff0c;蝴蝶翩翩起舞。我们的身体也需要特别的关爱和养护&#xff0c;保持健康和活力&#xff0c;更好地迎接每一次季节…

Shiro——01,环境搭建

环境搭建 一、什么是 Shiro&#xff1a;二、Shir 核心组件三、Shiro 运行机制如图四、用户角色权限三者关系五、搭建环境一键三连有没有捏~~ 一、什么是 Shiro&#xff1a; 官网&#xff1a;http://shiro.apache.org/ 是一款主流的 Java 安全框架&#xff0c;不依赖任何容器&…